码迷,mamicode.com
首页 > 其他好文 > 详细

fork()系统调用的理解

时间:2020-03-13 21:02:34      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:表示   type   图片   代码   进程   pre   https   alt   child   

 

系统调用fork()用于创建一个新进程。我们可以通过下面的代码来理解,最好是能自己敲一遍运行验证。

 

?#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
?
int main(int args, char *argv[]){
    printf("hello world (pid:%d)\n", (int) getpid());
    int rc = fork();
    if (rc < 0){                                                                                                    
        fprintf(stderr,"fork failed\n");
        exit(1);
    }else if (rc == 0){
        printf("hello, I am child (pid:%d)\n", (int) getpid());
    }else{
        printf("hello, I am parent of %d (pid:%d)\n",rc,(int) getpid());
    }
     return 0;
}
?

 

执行结果:

hello world (pid:18905)
hello, I am parent of 18906 (pid:18905)
hello, I am child (pid:18906)

 

 

技术图片

 

整段代码我们可以理解成三大步:

 

第一步:打印"hello world";

第二步:fork()一个新的进程;

第三步:判断rc的返回值并打印对应的信息;

    1)当rc<0时,表示fork一个新进程失败;

    2)当rc=0时,表示fork进入的是子进程;

    3)当rc等于其他值时,表示fork进程成功,并将子进程的值赋值给rc。

 

从下面这张图可以很清晰的看到,父进程执行的步骤是123,子进程执行的步骤是23。其中父进程和子进程执行第三步的时候是没有先后顺序的,由CPU调度程序(scheduler)决定在某个哪个进程被执行。也就是上面的结果,后面两行每次打印的顺序结果可能是不一样的。

技术图片

 

 

这里需要特别注意的是:

1、子进程不会从main()函数开始执行,而是直接从fork()系统调用返回,就好像是他自己调用了fork。

2、子进程并不是完全拷贝了父进程。虽然它拥有自己的地址空间(拥有自己的私有内存)、寄存器、程序计数器等,但是它从fork()返回的值是不一样的。父进程获得的返回值是新创建子进程的PID,而子进程获得的返回值是0。

 

fork()系统调用的理解

标签:表示   type   图片   代码   进程   pre   https   alt   child   

原文地址:https://www.cnblogs.com/lemon-le/p/12488549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!