计算机系统基础技术日志——fork函数
一、fork函数
fork()系统调用用于创建一个新进程。
fork函数被父进程调用一次,却返回两次;一次是在调用进程(父进程)中,一次是在新创建的子进程中。
在父进程中,fork返回子进程的PID。在子进程中,fork返回0。因为子进程的PID总是为零,返回值就提供一个明确的方法来分辨程序是在父进程中还是子进程中执行。
二、fork函数的具体代码分析
1.fork1
代码如下:
1. void fork1()
2. {
3. int x = 1;
4. pid_t pid = fork();
5.
6. if (pid == 0) {
7. printf("Child has x = %d\n", ++x);
8. }
9. else {
10. printf("Parent has x = %d\n", --x);
11. }
12. printf("Bye from process %d with x = %d\n", getpid(), x);
13. }
进程图如下:
2.fork2
代码如下:
1. void fork2()
2. {
3. printf("L0\n");
4. fork();
5. printf("L1\n");
6. fork();
7. printf("Bye\n");
8. }
进程图如下:
3.fork3
atexit函数指定了exit自动调用cleanup函数。
代码如下:
1. void cleanup(void) {
2. printf("Cleaning up\n");
3. }
4.
5. void fork3()
6. {
7. atexit(cleanup);
8. fork();
9. exit(0);
10. }
进程图如下:
4.fork4
父进程陷入while(1)死循环。子进程先于父进程结束,且父进程未回收子进程,故子进程成为僵死进程。
强行终止后调用ps指令查看进程可得到验证,子进程(PID = 3433)标识defunct。
代码如下:
1. void fork4()
2. {
3. if (fork(