https://blog.csdn.net/chenjiayi_yun/article/details/26242245
SYSCALL_DEFINE0(fork){
return do_fork(SIGCHLD, 0, 0, NULL, NULL);
}
SYSCALL_DEFINE0(vfork) {
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0,0, NULL, NULL);
}
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
int __user *, parent_tidptr, int, tls_val, int __user *, child_tidptr){
return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
}
实际上产生效果的也是这些参数:
CLONE_VM标识:表示共享地址空间(变量等),其中一个进程修改内存,另外一个进程读取也会变化。好像时子进程共用父进程的mm_struct.
CLONE_FILES标志:表示共享文件描述符表
CLONE_VFORK标识:标识父进程会被阻塞,子进程会把父进程的地址空间锁住,直到子进程退出或执行exec时才释放该锁;没定义的话,那么父子进程同事被调度执行。
SIGCHLD标识:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。信号的捕捉函数中通常调用wait函数以取得进程ID和其终止状态。