我目前正在上操作系统课,我的老师花了一半的课时谈论 PID。她提到,正如许多人所知,进程知道他们父母的 ID。
我的问题是这样的:
进程的 PCB 是否知道其子进程的 ID?如果是这样,获得它的方法是什么?
我目前正在上操作系统课,我的老师花了一半的课时谈论 PID。她提到,正如许多人所知,进程知道他们父母的 ID。
我的问题是这样的:
进程的 PCB 是否知道其子进程的 ID?如果是这样,获得它的方法是什么?
据我所知,一个进程没有明确的子进程 PID 列表,但它可以很容易地构建,因为进程应该知道它产生了哪个子进程。例如,UNIX fork() 调用在父进程中返回子 PID,在子进程中返回 0,Windows 上的 CreateProcess() 返回 (IIRC) 创建的新进程的 PID。
在*nix上使用fork()
时,返回值为父进程中子进程的PID,子进程中为0。这是找出答案的一种方法。
不确定他们是否跟踪进程生成的“树”,我认为这取决于您使用的操作系统,但是由于当您杀死 bash(或任何 shell)时,所有正在运行的子进程也会被杀死,我认为类似 UNIX 的系统会这样做跟踪这一点。
如果您使用的是 Linux 或任何实现 Unix API 的东西,当进程调用 fork() 创建子进程时,父进程会收到子 PID 作为返回码,如果 fork 失败,则为 -1。子进程获得零返回码。
Process 的 PCB 知道它的子 ID。
正如我们所知,Fork() 用于创建进程。它不接受任何参数并返回一个进程 ID。创建新的子进程后,父进程和子进程都将执行 fork() 之后的下一条指令。在那里我们必须区分父母和孩子。这可以通过测试 fork() 的返回值来完成。
如果 Fork() 返回负值,则子进程创建不成功。如果 Fork() 向新创建的子进程返回零。如果 Fork() 将一个正值作为子进程的进程 ID 返回给父进程。