关于fork()的学习

Posted helloworldcode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于fork()的学习相关的知识,希望对你有一定的参考价值。

返回类型

  pit_t是Linux下的进程号类型,也就是Process ID _ Type 的缩写。 在宏定义中是unsigned int类型。

fork()的返回值

  负数:如果出错,则fork()返回-1,此时没有创建新的进程。最初的进程仍然运行。

    零  :在子进程中,fork()返回0。

  正数:在父进程中,fork()返回正的子进程的PID。

相关测试

#include<stdio.h>
#include<iostream>
using namespace std;
#include <unistd.h>;
#include <sys/types.h>;
main ()
{
    pid_t pid;
    pid=fork();
    if (pid < 0) printf("error in fork!");
    else if (pid == 0){
        printf("I am the child process, my process id is %d
",getpid());
    }
    else{
        printf("I am the parent process, my process id is %d
",getpid());
        exit(0);    //父进程退出
    }
    printf("子进程仍然在运行中......");
}

 测试结果

  am the parent process, my process id is 26575
  I am the child process, my process id is 26583
  子进程仍然在运行中......
  按 <RETURN> 来关闭窗口...

 测试说明

  操作系统创建一个新的进程(子进程),并且在进程表中相应为它建立一个新的表项。新进程和原有进程的可执行程序是同一个程序;上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!父进程继续执行,操作系统对fork的实现,使这个调用在父进程中返回刚刚创建的子进程的pid(一个正整数),子进程在之后的某个时候得到调度,它的上下文被换入,占据 CPU,操作系统对fork的实现,使得子进程中fork调用返回0。所以在这个进程(注意这不是父进程了哦,虽然是同一个程序,但是这是同一个程序的另外一次执行,在操作系统中这次执行是由另外一个进程表示的,从执行的角度说和父进程相互独立)中pid=0。

  为什么看上去程序中互斥的两个分支都被执行了?在一个程序的一次执行中,这当然是不可能的;但是你看到的两行输出是来自两个进程,这两个进程来自同一个程序两次执行的结果。

以上是关于关于fork()的学习的主要内容,如果未能解决你的问题,请参考以下文章

MMDet提交PR的学习笔记

github 修改fork的代码之后如何提交代码并pull request

向Linus学习,让代码具有good taste

fork学习   特别提示

关于pid_t和fork()的理解,linux tomcat mysql php安装

关于linux系统如何实现fork的研究