关于第二次作业课堂笔记
fork()的函数作用是创建一个子进程,这个子进程几乎和原进程是一模一样的。
首先看一下如下的示例代码,根据作业做了适当的调整以显示fork的实际作用:
我在fork调用前和调用后分别输出了一些提示用代码,并在最后的process over部分添加了一些提示用输出语句:
#include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid, pid1, pid2; // pid2 = getpid(); // printf("Start fork() function in %d\n", pid2); printf("Start fork() function\n"); pid = fork(); printf("After fork() function\n"); // pid2 = getpid(); // printf("After fork() function in %d\n", pid2); if (pid < 0){ fprintf(stderr, "Fork Failed"); return 1; } else if (pid == 0){ pid1 = getpid(); printf("child: pid = %d\n", pid); printf("child: pid1 = %d\n", pid1); } else{ wait(NULL); pid1 = getpid(); printf("parent: pid = %d\n", pid); printf("parent: pid1 = %d\n", pid1); } pid2 = getpid(); printf("Process %d is over\n", pid2); return 0; }
注:注释掉的代码并非错误代码,在之后的笔记中会用到
这段代码在执行后输出的结果为:
Start fork() function After fork() function After fork() function child: pid = 0 child: pid1 = 99090 Process 99090 is over parent: pid = 99090 parent: pid1 = 99089 Process 99089 is over
从这一块我们可以关注到以下几点:
对于fork前的代码,子进程是没有执行的,也就是说只有fork之后的代码被完全还原了。
两个进程是同时执行的,即fork()执行后,两个进程“同时”执行了"After fork() funtion"的printf函数。但是这里有坑,在多进程编程中可能会碰到问题,在之后的程序中会有说明
parent进程是在child进程之后执行的。为什么?因为after fork两者是前后同时输出,但是parent的 “Process xxxx is over”是在child之后执行的
在子进程中,pid = fork()这句将0赋值给pid,几乎不做其他工作,并执行之后的代码工作。当再次执行getpid的时候,我们可以观测到process 的pid已经变成不同的数值。
到这里基本上fork的功能就算介绍完毕,但在使用fork函数的时候我又碰到了一些其他的问题:
新的示例代码如下:
#include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid, pid1, pid2; pid2 = getpid(); printf("Start fork() function in %d\n", pid2); // printf("Start fork() function\n"); pid = fork(); // printf("After fork() function\n"); // pid2 = getpid(); printf("After fork() function in %d\n", pid2); if (pid < 0){ fprintf(stderr, "Fork Failed"); return 1; } else if (pid == 0){ pid1 = getpid(); printf("child: pid = %d\n", pid); printf("child: pid1 = %d\n", pid1); } else{ wait(NULL); pid1 = getpid(); printf("parent: pid = %d\n", pid); printf("parent: pid1 = %d\n", pid1); } pid2 = getpid(); printf("Process %d is over\n", pid2); return 0; }
程序执行结果为:
Start fork() function in 99213 After fork() function in 99213 After fork() function in 99213 child: pid = 0 child: pid1 = 99214 Process 99214 is over parent: pid = 99214 parent: pid1 = 99213 Process 99213 is over
在start fork()这句话之前我们就调用了 getpid这句话,但是在After fork()中,输出的是两个完全相同的结果。对如上代码再进行修改:
#include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid, pid1, pid2; pid2 = getpid(); printf("Start fork() function in %d\n", pid2); // printf("Start fork() function\n"); pid = fork(); // printf("After fork() function\n"); pid2 = getpid(); //再次调用getpid函数获取当前进程id编码 printf("After fork() function in %d\n", pid2); if (pid < 0){ fprintf(stderr, "Fork Failed"); return 1; } else if (pid == 0){ pid1 = getpid(); printf("child: pid = %d\n", pid); printf("child: pid1 = %d\n", pid1); } else{ wait(NULL); pid1 = getpid(); printf("parent: pid = %d\n", pid); printf("parent: pid1 = %d\n", pid1); } pid2 = getpid(); printf("Process %d is over\n", pid2); return 0; }
执行结果如下:
Start fork() function in 99304 After fork() function in 99304 After fork() function in 99308 child: pid = 0 child: pid1 = 99308 Process 99308 is over parent: pid = 99308 parent: pid1 = 99304 Process 99304 is over
从这里我们几乎可以更清晰的看到各个进程的执行效果:
1.子进程没有执行fork之前的任何编码(子进程id为99308
2.父进程的所有变量数值会传递给子进程,两个进程(至少在不做任何处理的情况下)的变量是共用的!这在多线程(进程)编程中相当重要
3.我们更能确定父进程是在子进程之后执行的对应程序代码。
《---未完待续---》

浙公网安备 33010602011771号