gxlsunday 发表于 2014-4-14 11:12

linux下创建子进程的调用是fork()

linux下创建子进程的调用是fork()

1.      #include <unistd.h>   
2.      #include <sys/types.h>   
3.      #include <stdio.h>   
4.         
5.         
6.         
7.      void print_exit()
8.      {
9.               printf("the exit pid:%d/n",getpid() );
10.      }
11.         
12.      main ()   
13.      {   
14.         pid_t pid;   
15.         atexit( print_exit );      //注册该进程退出时的回调函数   
16.            pid=fork();   
17.                if (pid < 0)   
18.                        printf("error in fork!");   
19.                else if (pid == 0)   
20.                        printf("i am the child process, my process id is %d/n",getpid());   
21.                else   
22.                {
23.                     printf("i am the parent process, my process id is %d/n",getpid());   
24.                      sleep(2);
25.                      wait();
26.               }
27.         
28.      }

我知道fork()有两个返回值,我有一下不明白的fork()以后,根据返回值执行else if(pid == 0)()里面的程序,执行完了,程序不是完了,退出了这个函数。什么时候执行父进程里面的程序

nickyamw 发表于 2014-4-14 11:22

我也不懂,为什么fork()创建子进程之后,会有可能返回父进程的pid

dufanbao 发表于 2014-4-14 14:18

不能按照过程来理解这段程序,fork以后,会复制一个和父进程一样的运行环境给子进程,所以会有两个进程。

nickyamw 发表于 2014-4-14 14:22

dufanbao 发表于 2014-4-14 14:18 static/image/common/back.gif
不能按照过程来理解这段程序,fork以后,会复制一个和父进程一样的运行环境给子进程,所以会有两个进程。 ...

但fork只能返回一个值,怎么确定返回的是父进程的pid,还是子进程的pid?

dufanbao 发表于 2014-4-14 15:22

nickyamw 发表于 2014-4-14 14:22 static/image/common/back.gif
但fork只能返回一个值,怎么确定返回的是父进程的pid,还是子进程的pid?

返回值是0,就是子进程。返回值大于0,就是父进程(这个值是fork出的子进程pid)。

nickyamw 发表于 2014-4-14 15:55

dufanbao 发表于 2014-4-14 15:22 static/image/common/back.gif
返回值是0,就是子进程。返回值大于0,就是父进程(这个值是fork出的子进程pid)。 ...

执行fork之后复制了父进程,但fork执行完之后相关的寄存器不是恢复了么,怎么能继续执行子进程

dufanbao 发表于 2014-4-14 16:43

nickyamw 发表于 2014-4-14 15:55 static/image/common/back.gif
执行fork之后复制了父进程,但fork执行完之后相关的寄存器不是恢复了么,怎么能继续执行子进程 ...

执行完fork,就创建了一个进程,此进程由操作系统负责管理,参与调度,你说的寄存器指的是什么,是硬件的寄存器么,fork是linux的环境编程,是基于操作系统的,不要纠结硬件寄存器。

nickyamw 发表于 2014-4-14 17:05

dufanbao 发表于 2014-4-14 16:43 static/image/common/back.gif
执行完fork,就创建了一个进程,此进程由操作系统负责管理,参与调度,你说的寄存器指的是什么,是硬件的 ...

这样子啊。

dirtwillfly 发表于 2014-4-14 21:43

可以看看这个:http://baike.baidu.com/link?url=C92et2VKf7wlLsJ_PTf1wyJnutLDzlMqtRzUBb1no0GkxjreNTCOM-w0FURYkgFGagovbpJ9D7GPCMQMLZJwP_

lvyunhua 发表于 2014-4-15 10:35

支持下!

outstanding 发表于 2014-4-15 22:04

看看。。。
页: [1]
查看完整版本: linux下创建子进程的调用是fork()