电脑技术学习

UNIX 进程揭秘

dn001

  清单 5 是用于打开文件的简单程序,并派生 (fork) 为父进程和子进程。每个进程从同一文件描述符(它只是一个包含数字 1 至 7 的文本文件)执行读取操作,并连同 PID 一起打印所读取的内容。在读取一行之后,将 PID 写到输出文件。当输入文件中没有其他字符可供读取时,循环结束。

  清单 5 的输出表明,当一个进程从该文件读取时,两个进程的文件指针都在移动。同样地,当向某个文件写入时,下一个字符被写到文件结尾。这是非常有意义的,因为内核跟踪打开文件的信息。文件描述符只不过是进程的标识符。

  您可能还知道,标准输出(屏幕)也是一个文件描述符。此文件描述符在 fork 调用期间被复制,这就是两个进程都能对屏幕执行写入操作的原因。

  父进程或子进程的终止

  进程必须在某个时候终止。问题只是哪个进程首先终止:父进程还是子进程。

  父进程在子进程之前终止

  如果父进程在子进程之前终止,孤立的子进程需要知道它们的父进程是谁。记住,每个进程都有父进程,并且您可以跟踪从每个子进程一直到 PID 1(或称为 init)的整个进程家族树。当某个父进程终止时,init 将接纳所有子进程,如清单 6 所示。

  清单 6. 在子进程之前终止的父进程

#include <unistd.h>
#include <stdio.h>
int main(void) {
    int i;
    if (fork()) {
        /* Parent */
        sleep(2);
        _exit(0);
    }
    for (i=0; i < 5; i++) {
        printf("My parent is %dn", getppid());
        sleep(1);
    }
}
sunbox$ gcc dIE1.c -o die1
sunbox$ ./die1
My parent is 2920
My parent is 2920
sunbox$ My parent is 1
My parent is 1
My parent is 1

标签: