【发布时间】:2014-10-30 01:05:01
【问题描述】:
可以创建其他进程(子进程)的进程,同时以下是正确的:
a) 进程的 PID=0
b) 子进程可以继续独立生活
c) 进程创建者将其上下文复制到子进程
d) 以上都是正确的
我的观点是 a) 不可能,因为 PID=0 是保留的,处理器创建者也不会将其上下文复制到子进程,所以我在考虑 b,因为它可以独立生活,但不是吗被称为守护进程呢??那么这个问题有正确(True)的答案吗?
【问题讨论】:
可以创建其他进程(子进程)的进程,同时以下是正确的:
a) 进程的 PID=0
b) 子进程可以继续独立生活
c) 进程创建者将其上下文复制到子进程
d) 以上都是正确的
我的观点是 a) 不可能,因为 PID=0 是保留的,处理器创建者也不会将其上下文复制到子进程,所以我在考虑 b,因为它可以独立生活,但不是吗被称为守护进程呢??那么这个问题有正确(True)的答案吗?
【问题讨论】:
阅读fork 以了解如何创建子进程。这可能很好地回答了你的问题
【讨论】:
fork() 系统调用创建现有进程的克隆/副本。现在两个进程正在运行,具有相同的数据、程序中的位置和进程映像。区别在于 fork() 系统调用的返回值。
由于fork()函数给父(forking)进程和子(forked)进程返回不同的值,可以判断是在父进程还是子进程中运行。
父(分叉)进程在父进程中收到结果 fork() == childpid,因此父进程知道子进程的进程 ID(因此可以杀死它,等待它终止等)。
父级也可以收到结果 fork() == -1,表示 fork() 系统调用失败。
子(分叉)进程在子进程中收到结果fork() == 0,如果你想知道子进程的进程id,你只需询问当前进程id就可以得到进程id孩子的。
这是我发布的代码示例的相关帖子,How to use fork()。
微妙之处在于 (a) 不正确,因为父子进程中的每一个都有一个不 =0 的进程 id,但从 fork() 返回的进程在子进程中总是 =0。因此,手册可能会说 PID 为 =0。 (b) 部分是正确的。 (c) 部分不正确,因为不是进程创建者复制任何内容,而是系统调用(在父进程的上下文中)进行复制。
【讨论】: