简单的 fork() 用法
fork1.c
中的代码不过就是发出 fork
调用,并通过一个 printf
调用来打印整数结果。虽然只发出了一个调用,但是打印了两次输出。这是因为在 fork
调用中创建了一个新进程。现在有两个单独的进程在从该调用返回结果。这通常被描述为“调用一次,返回两次”。
fork
返回的值非常有趣。其中一个返回 0;另一个返回一个非零值。获得 0 的进程称为子进程,非零结果属于原始进程,即父进程。您将使用返回值来确定哪个是父进程,哪个是子进程。由于两个进程都在同一空间中继续运行,唯一有实际意义的区别是从 fork
返回的值。
0 和非零返回值的基本原理在于,子进程始终可以通过 getppid()
调用来找出其父进程是谁,但是父进程要找出它的所有子进程却很困难。因此,要告诉父进程关于其新的子进程的信息,而子进程可在需要时查找其父进程。
考虑到 fork
的返回值,现在该代码可以检查确定它是父进程还是子进程,并进行相应的操作。
在每个步骤打印出 PID,并且该代码检查从 fork
返回的值来确定哪个进程是父进程,哪个进程是子进程。对所打印的 PID 进行比较,可以看到原始进程是父进程 (PID 767),并且子进程 (PID 768) 知道其父进程是谁。请注意子进程如何通过 getppid
来知道其父进程以及父进程如何使用 fork
来定位其子进程。