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)

(待考证?)

参考: