fork()在Unix中创建新进程的方式。调用时fork,将创建自身的进程的副本,该副本具有自己的地址空间。
#include <unistd.h>
pid_t fork(void);
fork的返回值:
父进程中:返回新建子进程的pid
子进程中:返回0
错误返回负数-1
fork过程:
1)新建进程
2)复制父进程的数据到子进程(共享内存空间)(代码段,数据段,BSS段,堆,栈,打开文件的描述符,env......)
3)eip指向新进程指令(fork函数执行后的代码处)
例子:
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid = fork();
if(pid < 0){
printf("fork error \\n");
return 0;
}
if(pid == 0){
printf("child process,pid: %d\\n",getpid());
}else{
printf("parent process,pid: %d\\n",getpid());
}
printf("exit %d\\n",getpid());
return 0;
}
fork 父子返回值不同
复制时复制了父进程的堆栈,两个进程都停留在fork函数中,等待返回。 一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。
调用fork函数 -> sys_fork-> 复制进程信息生成子进程 -> 设置当前进程,子进程的eax -> 当前进程返回(return值为eax中的内容) -> fork执行完毕 -> 操作系统切换进程到子进程 -> 子进程获取到返回值(eax)
(待考证?)
参考: