子进程显示我是pid 25111的子进程。我认为子进程pid应该是0
不。在父级中fork()
返回孩子的 pid。在孩子身上,fork
返回 0——即not任何东西的 pid,它只是一个标记。子进程 pid 为 25111,如下getpid
告诉过你了。
对于父进程,fork 返回 25111,但 getpid() 返回 25110
正确的。父进程 pid 始终为 25110,如下所示getpid
告诉过你了。和fork()
返回新孩子的 pid。
事实是fork
在父级中返回相同的值getpid
返回的孩子证明这一切都工作正常。
听起来像你认为的fork()
总是返回你所在进程的 pid。但这没有意义——我们已经有了getpid
呼吁这一点。
如果你是家长,fork()
返回 pidother过程,孩子。如果你是那个孩子,fork()
根本不返回 pid。 (如果你是孩子,并且想知道父母的 pid,这是一个很好的、常见的、单独的问题。答案:调用getppid()
.)
我们可以将这一切总结如下:
parent child
------ -----
pid: 25110 25111
fork returns: 25111 0
getpid returns: 25110 25111
getppid returns: ????? 25110
记住这一点的方法是考虑将要调用的代码fork()
:它将做什么,需要知道什么。父母需要知道它是父母。孩子需要知道这是他自己。父进程经常需要知道子进程的 pid(并且没有其他方法获取它)。
If fork
总是返回一个pid,然后fork
调用,查看它的返回值,您将无法知道您是父级还是子级 - 但这通常是您需要知道的第一个也是最重要的事情。
(在所有这一切中,我忽略了第三种可能性,即fork
失败,并在父级中返回 -1,并且在子级中不返回任何内容,因为不存在。)
也可以看看为什么子进程中fork()返回0? https://stackoverflow.com/questions/25718225/why-fork-return-0-in-the-child-process?rq=1 .