UNIX环境高级编程:进程管理和通信
注意: 子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。 #include<unistd.h> pid_t vfork( void ) 函数说明 vfork创建的子进程与父进程共享数据段,而且由vfork创建的。子进程将先于父进程运行。 返回值: 如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork失败则直接返回-1,失败原因存于errno中。 错误代码 : EAGAIN 进程数已达系统规定上限 ENOMEM 内存不足,无法配置核心所需的数据结构空间。 vfork()用法与fork()异同点: fork():子进程拷贝父进程的数据段,代码段. vfork():子进程与父进程共享数据段. fork():父子进程的执行次序不确定。vfork():保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec,或exit之后父进程才可能被调度运行 vfork()保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。 创建子进程,(写时拷贝)拷贝数据段、代码 哪些不拷贝?(完整拷贝需要与线程区别) 进程的退出 return 0 void exit( int status )<stdlib.h> void _exit( int status ) <unistd.h> 参数: status 传递进程结束时的状态,通常0表示正常结束,非零表示出现错误,可以使用wait系统调用来接收子进程的返回值。 exit( )和_exit( )区别 _exit( ) 直接结束进程,清除其使用的内存空间,销毁其在内核中的数据结构,不刷新缓冲区。 exit( ) 退出时要清理缓存区 exec函数族 找到可执行文件,用它来取代原调用进程的数据段、代码、栈。进程号除外。 #include <unistd.h> int execl ( const char *path, const char *arg, …… ); int execv ( const char *path, char * const argv[ ] ); int execle ( const char *path, const char *arg, …… , char * const envp[ ] ); int execve( const char *path, char * const arg[ ], …… , char * const envp[ ] ); int execlp( const char *file, const char *arg, …… ); int execvp ( const char *file, char *const arg, …… ); (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |