#include <unistd.h>
pid_t fork(void);
功能:在已有的进程基础上有创建一个子进程
参数:无
返回值:
成功:
>0 子进程的进程号,标识父进程的代码区
0 子进程的代码区
失败:
-1 返回给父进程,子进程不会创建
使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间
地址空间:
包括进程上下文、进程堆栈、打开的文件描述符、信号控制设定、进程优先级、进程组号 等。
子进程所独有的只有它的进程号,计时器等。因此,使用fork函数的代价是很大的。
fork函数执行完毕后父子进程的空间示意图:
1.1创建一个子进程
我们在使用fork函数时 最好要区分父子进程,且如果fork之后不区分父子进程的代码区,则后面所有的代码都会执行
实例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if(pid < 0)
{
perror("fail to fork");
return ‐1;
}
else if(pid > 0) //父进程的代码区
{
printf("parent: pid = %d, ppid = %d\n", getpid(), getppid());
printf("pid = %d\n", pid);
printf("this is a parent process\n");
}
else //子进程的代码区
{
printf("son: pid = %d, ppid = %d\n", getpid(), getppid());
printf("this is a son process\n");
}
}
return 0;
}
我在父进程的代码区中用getpid()打印了自己的进程号和getppid()父进程的父进程的进程号
又打印了fork()函数的返回值pid
在子程序的代码区中,我也打印了它自己的进程号,和它父进程的进程号
运行结果
从运行结果来看,子进程中的父进程号等于父进程中自己的进程号
子进程的进程号也确实是fork函数的返回值pid.