是否有人熟悉os/161并且可以为我回答几个问题?
孩子pid,父母pid如何运作。
我知道当你调用thread_fork()
时,你正在创建另一个基于当前线程的线程,新线程应该有自己的唯一id和不同的文件描述符表。当sys_fork
从curthread
创建一个孩子时,除了pid之外,孩子与父母一样。但我对pid和父pid的工作原理感到困惑。
这是我对流程表的解释。整个系统只有一个进程表。现在我的每个帖子都有parent_pid
和my_pid
- 父线程可以有多个子节点(通过不断调用sys_fork
)
- 一个孩子只能有一个父母
- 无论何时调用sys_fork
,都会创建一个子项,并将此子项的parent_pid
设置为创建此子项的线程的pid。
-pid为1用于启动/菜单线程。
我是否正在理解流程表如何运作?
最后一个问题:
对于sys_waitpid()
:只有父级才能使用waitpid
?他们只能等待他们的孩子?孩子可以在父母身上使用waitpid
(或者这会导致死锁)吗?
我一直在搜索谷歌,但是我发现了很多矛盾,到目前为止我仍然无法找到答案。
答案 0 :(得分:3)
我对OS / 161一无所知 - 但你的描述听起来很像标准的POSIX系统。所以,这就是你的问题如何与POSIX一起使用,并希望它们对OS / 161也有意义。
只有父母打电话给waitpid()
。应用程序围绕此设计。如果pid不是调用进程的子进程,则waitpid()
的POSIX规范要求返回错误,并将errno设置为ECHILD
。
儿童可以通过查看自己的parent pid
:getppid(3)
来判断其父母是否已经死亡。如果是1
,那么他们的父母已经死亡,他们的父母已经设置为init
。 (init
准备好在所有孤儿死亡时收获它们,因此进程状态不会延迟并用僵尸进程填充系统进程表。)(现代系统没有一个“进程表”,但是pid必须被回收,并且一些进程控制信息必须保留在内核中,直到调用某种类型的wait()
来获得进程。这个内存太重要了,不能留空长。)