美文网首页
关于fork()

关于fork()

作者: RedHatMe | 来源:发表于2018-08-30 00:37 被阅读0次
    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

    相关文章

      网友评论

          本文标题:关于fork()

          本文链接:https://www.haomeiwen.com/subject/mzvlwftx.html