_nosay 发表于 2018-07-28 13:33

wait()疑问?

本帖最后由 _nosay 于 2018-07-28 13:36 编辑

if ((pid = fork()) == 0) {// 1
    exit(0);// 2
}
waitpid(pid, NULL, 0);// 3

假设执行顺序是1->2->3,由于2执行后,不一定马上就切换到父进程执行3,如果这段时间里,子进程的进程号被另外一个死循环的进程复用了,那3不就得一直等待了?

amarant 发表于 2019-03-26 13:29

很有意思的话题,lz 很善于思考呀。想了一想:
1. pid 是单调递增的,要用完 32 bit 的 pid ,需要的时间太长了。
2. exit 调用后,并不会马上回收 task struct。所以 pid 也不会被回收。需要等待 wait 完成后, task struct 才会被回收。可以看 kernel 中的这两个函数: do_exit() 和 do_wait() --> wait_task_zombie() --> release_task()
具体逻辑我没仔细阅读,根据教科书上“僵尸进程”内容,和大概扫了一眼代码。逻辑基本是这样的。LZ 可以仔细阅读这些函数,理顺了逻辑再分享出来给大伙 ;-)

_nosay 发表于 2019-04-30 15:35

回复 2# amarant

好久没上论坛了,感谢指点:em09:

aweii 发表于 2021-05-03 18:04

2楼正解,release_task->__exit_signal->__unhash_process->detach_pid

aweii 发表于 2021-05-03 18:05

进程退出后不会消失无踪,还有等“收尸”的
页: [1]
查看完整版本: wait()疑问?