函数名
fork:创建一个子进程
函数原型
pid_t fork(void);
调用该函数时,需包含以下头文件
#include <unistd.h>
返回值
fork函数调用成功,返回两次PID
(1)返回值为0,代表当前进程是子进程
(2)返回值为非负数,代表当前进程是父进程
(3)调用失败,则返回-1
代码展示
1.fork函数直接调用
简单输出父进程和子进程的值
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;//定义一个pid
pid = getpid();//调用函数获取进程的值
fork();
printf("pid = %d,current pid = %d\n",pid,getpid());
return 0;
}
pid是原先进程的值,而getpid()输出的是当前进程的值。 fork会打印两次结果,一次是父进程,一次是子进程。 这里pid是父进程,所以第一行打印的是父进程,其结果原先pid和当前pid的值一样;而第二行打印的是子进程,pid的值还是原先进程的值(即父进程的值),而当前的pid值则不一样。
fork函数前后值的变化
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid_t pid2;
pid = getpid();
printf("before fork pid is %d\n",pid);
fork();
pid2 = getpid();
printf("after fork ppid is %d\n",pid2);
if(pid = pid2)//fork函数后会输出父进程和子进程,将后来的进程值与一开始的父进程的值进行判断
{
printf("This is father pid,pid is %d\n",pid2);//相等为父进程
}
else
{
printf("This is child pid,pid is %d\n",pid2);//不等为子进程
}
return 0;
}
在fork函数之前,只有一个父进程pid,由结果可知打印了一次父进程。 在fork函数之后,函数分别打印了父进程和子进程的值。可见二三行的值是父进程的值,四五行是子进程的值。
2.fork返回值调用
可以用于判断当前进程是父进程还是子进程
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
printf("father pid is %d\n",getpid());
pid = fork();
if(pid > 0)
{
printf("This is father pid,pid is %d\n",getpid());
}
else if(pid == 0)
{
printf("This is child pid,pid is %d\n",getpid());
}
return 0;
}
一开始先将当前的进程值(父进程)打印出来。通过if判断fork函数的返回值:返回值为非负整数,则将其当前的进程值输出,为父进程;返回值为0,则将其当前的进程值输出,为子进程。可见意儿行的pid值相同,而一三行的pid值不同。