初探进程——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
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()还是有的,只不过我平时没有注意到而已。