前言
在liunx进程中,fork()函数是非常重要的,它是进程的缔造者,今天我们就来探索下关于fork()函数的一些用法
一、父子进程号的差别
fork()函数创建进程后的情况是比较复杂的,一般来说,它会产生父子进程,而我们只需要对这两个进程来进行研究就可以解决大部分问题了。
下面我们来看一个例子:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
//定一两个进程变量,用来存放进程号
pid_t pid1;
pid = getpid();//获取进程号的函数,使用很简单,返回值就是进程号
printf("before fork: pid = %d\n",pid);//输出使用fork函数前的进程号,同接下来的做对比
fork();//创建一个进程
pid1 = getpid();
printf("before fork: pid = %d\n",pid1);//输出使用fork函数后的进程号,同前面做对比
if(pid == getpid()){//一般父进程的进程号等于原先的进程号,而子进程号则会发生改变
printf("this is father print\n");
}else{
printf("this is child print,child pid = %d\n",getpid());
}
return 0;
}
再看看这个程序的运行结果:
可以很明显的看到出现了两个进程号,并且能够验证父子进程的进程号是不一致的,因而fork函数建立进程后,父进程和子进程会分别走向自己的那条路,它们之间互不干扰,当然它们运行的先后顺序目前我们仍然无法判断。
二、fork函数的返回值
前面我们知道了父子进程各自的进程号是不一样的,现在我们来探究一下fork函数的返回值到底是怎么样的,下面根据上面的demo来改变一下,继续测试:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid_t pid1;
pid_t retpid;
pid = getpid();
printf("before fork: pid = %d\n",pid);
retpid = fork();//获取fork函数的返回值
pid1 = getpid();
printf("before fork: pid = %d\n",pid1);
if(pid == getpid()){
printf("this is father print,the retpid = %d\n",retpid);//输出fork函数的返回值,看看它究竟返回的是什么
}else{
printf("this is child print,retpid =%d child pid = %d\n",retpid,getpid());
}
return 0;
}
看看实际运行效果:
可以看到在父进程中fork函数的返回值是正的,而在子进程中则是为0,因而fork函数会发生两次返回,一次是大于零的,这是给父进程返回的,一次是等于零,这是给子进程返回的,当fork函数返回的值为-1时,则进程创建失败。
总结
fork的应用场景很多,因为当我们需要用到进程时,就必须用到这个函数,今天我们算是初步了解了它的用法以及一些概念,后续还会有更加深入的知识等着我们。