天天看点

进程之fork函数的用法前言一、父子进程号的差别二、fork函数的返回值总结

文章目录

  • 前言
  • 一、父子进程号的差别
  • 二、fork函数的返回值
  • 总结

前言

在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函数建立进程后,父进程和子进程会分别走向自己的那条路,它们之间互不干扰,当然它们运行的先后顺序目前我们仍然无法判断。

二、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函数的用法前言一、父子进程号的差别二、fork函数的返回值总结

可以看到在父进程中fork函数的返回值是正的,而在子进程中则是为0,因而fork函数会发生两次返回,一次是大于零的,这是给父进程返回的,一次是等于零,这是给子进程返回的,当fork函数返回的值为-1时,则进程创建失败。

总结

fork的应用场景很多,因为当我们需要用到进程时,就必须用到这个函数,今天我们算是初步了解了它的用法以及一些概念,后续还会有更加深入的知识等着我们。

继续阅读