初探进程——fork

  这段时间打算把以前学的东西好好做个总结,免得总是学一样,忘一样。Linux下的C编程,就从利用fork开辟一个新的进程开始吧。

  最开始接触fork的时候,觉得这个函数确实很有意思,一次调用,两次返回,看看下面这段程序:

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<unistd.h>
 4 #include<sys/types.h> 
 5 
 6 int main(int argc, char *argv[])
 7 
 8     pid_t pid;                                  /*保存进程号            */
 9       
10     pid = fork();                               /*产生新的进程          */
11 
12     if (pid < 0) {                              /*如果创建进程失败       */
13         printf("Error!\n");
14         exit(-1); 
15     } else if (pid == 0) {                      /*如果进入子进程         */
16         printf("This is a child process,");
17         printf("My pid is %d\n", getpid());
18     } else {
19         printf("This is parent process,");      /*如果是父进程           */
20         printf("My pid is %d\n", getpid());
21     }
22 
23     return 0
24 


运行结果如下:

This is parent process,My pid is 2945
This is a child process,My pid is 2946

  最初对这个确实感到很疑惑,C语言不是规定一个函数只能有一个返回值吗?这个怎么可以返回两次,而且让程序也重复执行了两次。后来才知道,原来是fork“搞的鬼”,程序在fork处就已经开始“分裂”成两个进程了,当程序运行在子进程的时候,其fork返回值为0,这就是else if (pid == 0)这个选择分枝;而当程序运行在父进程中的时候,其返回值就是子进程的pid;最坏的情况,就是开辟进程失败,这个时候,系统通常会返回一个负数if(pid < 0),可以利用error来判断是什么错误,不过,我这个程序中为了简单起见,并没有对该错误进行判断。

  在进程结束后,调用exit()来退出进程,但是大家会发现,在上面的程序中,除了在创建线程失败后调用了exit(),其他的地方,并没有使用exit(),只在程序最后有个return,以前一直以为其实return就代替了exit(),不过今天在看《Linux 内核设计与实现》的时候,发现上面提到了这一点,其实在编译的时候,编译器在mian()函数的retrurn后面加了个exit(),原来,exit()还是有的,只不过我平时没有注意到而已。

posted @ 2010-05-14 23:50  MR_H  阅读(4038)  评论(8编辑  收藏  举报