我们知道,fork()将返回两次,即两个PID。子进程的PID在父进程中返回,并在子进程中返回0。
为什么在子进程中返回0?有什么特殊原因吗?
UPDATE 我被告知在父进程和子进程之间使用链表,父进程知道子进程的PID,但是如果没有孙进程,那么子进程将得到0我不知道这是不是正确的?
答案 0 :(得分:6)
至于你在标题中提出的问题,你需要一个被认为是成功的值,而不是真正的PID。 0
返回值是系统调用的标准返回值,表示成功。因此,它被提供给子进程,以便它知道它已成功从父进程分叉。父父进程接收子进程的PID,如果子进程没有成功分叉,则接收-1。
任何进程都可以通过调用getpid()
来发现自己的PID。
至于你的更新问题,它似乎有点落后。任何进程都可以使用getppid()
系统调用发现其父进程。如果进程没有跟踪fork()
的返回值,则没有直接的方法来发现其子节点的所有PID。
答案 1 :(得分:0)
你需要返回一些不能成为真正PID的东西(否则孩子可能认为它是父母)。
0
符合要求。
答案 2 :(得分:0)
来自docs:
返回值
成功完成后,fork()会向子项返回值0 处理并将子进程的进程ID返回给父进程 处理。否则,将值-1返回到父进程, 没有创建子进程,并且全局变量errno设置为 表示错误。
答案 3 :(得分:-1)
摘自本书(Unix中的高级编程)
fork向子级返回0的原因是进程只能具有 单亲,孩子可以随时致电getppid获取 其父级的进程ID。 (进程ID 0保留给 内核,因此不可能将0用作子进程的ID。