关于fork()

2018-08-30  本文已影响0人  RedHatMe
  1. fork()是内核程序创建进程的一种方式,由fork()创建的新进程被称为子进程(child process)。需要特别注意的是:该函数被调用一次,但返回两次。两次分别返回父进程和子进程。子进程的返回的是0(内核代码中设定的为0),而父进程返回的是子进程的进程PID。
    代码示例如下:
    相当于在fork之后,有两个进程(子进程和父进程)在执行fork之后的代码。但是父进程先执行,所以进了else ,子进程后执行,进if。

  2. 父进程和子进程共享代码段,但是分别拥有自己的数据段和堆栈段。一个进程的子进程可以不止一个。

  3. fork之后,操作系统会拷贝出一个与父进程完全相同的子进程,这两个进程共享代码段空间,但是数据段是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,子进程拥有父进程当前运行到的位置(两进程的程序计数器pc值相同,也就是说,子进程是从fork返回处开始执行的)。

  4. 有两个对立的观点,一是说:父进程先返回(因为对父进程来说,fork执行过程相当于函数调用);另一个中观点是说:父子进程哪个先运行与操作系统的调度有关,如果需要父子进程协同,可以通过原语的办法解决。

#include <unistd.h> //fork()
#include <sys/types.h>
#include <stdio.h>  //puts()

int main()
{
    int status;
    puts("start");

    //创建子进程
    pid_t pid = fork();
    if(pid==-1){
        perror("创建子进程失败");
        return 1;
    }

    //判断是否是子进程  
    if(pid==0){
        puts("I'm child");

        puts("sleep 5s ...");
        sleep(5);
        puts("sleep end");

        printf("子进程PID是%d\n", getpid());
        printf("父进程PID是%d\n", getppid());

        return 0;
    }
    else{
        puts("I'm parent");

        printf("子进程PID是%d\n", pid);
        printf("父进程PID是%d\n", getpid());
    }

    wait(&status);
    printf("%d\n", status);
    puts("main end");
    return 0;
}

运行结果:

start
I'm parent
子进程PID是22875
父进程PID是22874
I'm child
sleep 5s ...
sleep end
子进程PID是22875
父进程PID是22874
0
main end

引用:
https://blog.csdn.net/zhyoulun/article/details/53081368

上一篇 下一篇

猜你喜欢

热点阅读