天天看点

fork函数和vfork函数的区别(配合exec系列函数使用)

fork创建进程

pid_t fork(void);
功能:创建一个子进程
返回值:
    成功则返回两次,子进程返回0,父进程返回子进程ID。
    失败则返回一次	-1
           

vfork创建进程

pid_t vfork(void);
功能:创建子进程
返回值:
	失败返回 -1
    成功返回两次,子进程返回0,父进程返回子进程ID
           

区别:

vfork创建的子进程不会复制父进程的代码段资源,而是通过exec系列函数直接加载一个可执行文件启动子进程

子进程创建成功前,子进程暂时借用父进程的相关资源来加载子进程,而此时的父进程是阻塞状态,只有子进程创建成功后,父进程才继续运行。

​ 通过vfork创建的子进程,不会继承父进程的信号处理方式

int execl(const char *path, const char *arg, ...);
path:可执行文件的路径
arg:命令行参数,至少一个,且以NULL结尾
    
int execlp(const char *file, const char *arg, ...);
file:可执行文件名,该文件必须存储在path环境变量的路径下
arg:命令行参数,至少一个,且以NULL结尾
    
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
argv:存储命令行参数的字符串数组,最后一个必须是NULL
           

vfork配合execvp、wait使用例子:传送地址

继续阅读