fork函数简介
fork函数用于创建一个新进程,称为子进程,它与进程同时运行,此进程称为父进程。创建新的子进程后,两个进程共存,他们都将执行fork()函数调用之后的指令。子进程复制了父进程的堆栈段和数据段(写实拷贝),并不是共享,他们之间没有任何影响。
函数原型、头文件、参数信息及返回值
在终端输入man fork查看函数信息
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);//pid_t是一个宏定义 它本质是int 被定义在#includesys/types.h>中
fork函数不需要参数,当它调用失败时函数返回负值,当调用成功时有两个返回值,零和正值,零返回给子进程,正值返回给父进程,正值就是子进程的pid。
代码实现
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;//pid_t型 用于接收返回值
printf("father : id = %d\n",getpid());//getpid()获取当前pid并打印
pid = fork();//调用fork()函数
if(pid < 0)//如果返回值小于零执行此if语句
{
printf("Fork Call failed!\n");
}
else if(pid > 0)//如果返回值大于0执行此语句
{
printf("this is father print = %d\n",getpid());
}
else if(pid == 0)//如果返回值等于0执行此语句
{
printf("this is child print,child pid = %d\n",getpid());
}
return 0;
}
编译运行
可以看到if语句同时执行了两条,分别被父进程和子进程运行并打印pid,如何证明子进程创建的方式时复制而不是共享,编译以下代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
int data = 10;
printf("father : id = %d\n",getpid());
pid = fork();
if(pid > 0)
{
printf("this is father print = %d\n",getpid());
}
else if(pid == 0){
printf("this is child print,child pid = %d\n",getpid());
data = 6;
}
printf("data = %d\n",data);
return 0;
}
运行之后发现,父进程打印data值为10 而子进程打印data值为6