美文网首页
关于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()

    fork()是内核程序创建进程的一种方式,由fork()创建的新进程被称为子进程(child process)。需...

  • ostep-进程API

    也可以称为系统调用。 fork 在unix中,创建新的进程可以使用fork。 输出就像这样: 关于fork创建的子...

  • fork函数总结

    链接 一道关于fork的题目

  • Review - A Java Fork/Join Framew

    Review 这篇文章是Doug Lea 写的关于java中fork/join 的框架,主要简述了 fork/jo...

  • linux下千万不要运行

    无限fork :(){:|:&};: fork while fork 自杀 char esp[] __...

  • 2019-08-13

    fork()&&fork()||fork(); (2012-05-01 12:58:49) 转载▼ 标签: it ...

  • Git:fork 源仓库、fork 仓库副本和 local 仓库

    Fork 就是远程端上一份别人仓库的拷贝。 流程:fork 源仓库 ---① fork--> fork 仓库副本 ...

  • 2017-08-10 Java并发框架——Fork/Join

    1 资料集合 Fork/Join框架(一)引言Fork/Join框架(二)创建一个Fork/Join池Fork/J...

  • 关于git fork的理解

    我们在研发工作中,不可避免的会使用到git作为团队的仓库管理工具。当我们的团队有一定的规模或者出于对仓库安全性或简...

  • 关于git fork的实践

    公司团队中很多小组会使用vue架构搭建新的web项目,可能每个项目的创建者在初始化项目的时候都选择不同的项目设置、...

网友评论

      本文标题:关于fork()

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