fork用于创建新进程,新进程与原进程具有从属关系,原进程称之为父进程,新建进程称为子进程,此进程还有其他什么关系呢?
1. 进程号
子进程的父进程应该为原进程,原进程的子进程应该为新建的进程号。
2. 返回值
使用fork新建进程返回值有三种,出错返回-1,0返回给子进程 ,大于0的正整数返回给父进程。
3. 数据共享
子进程会复制父进程的所有数据,在fork进程之前是数据会被复制到子进程中,一般通过返回值来判断子进程执行的内容。
int main()
{
pid_t pid;
int i = 0;
pid = fork();
if (pid == -1) //创建失败
{
printf("creat process error!\n");
exit(1);
}
else if (pid == 0) //子进程
{
printf("The child process ID is %d\n",getpid());
i++;
}
else // 父进程
{
printf("The father process ID is %d\n",getpid());
i++;
}
printf("i = %d\n", i);
return 0;
}
首先看一下此程序段,按照常规的if...else... 的逻辑两段代码应该是矛盾的,不会同时执行,但是实际上却同时执行了,那么原因是什么呢?原因在于上面的第2点,返回值的返回为0给子进程,大于0给父进程。由于在采用fork之后,有两个进程同时执行,只不过在两个进程中,子进程执行的是if内的内容,而父进程执行的是else的内容,执行的程序段不一样而已,并不矛盾。