【发布时间】:2013-08-15 03:41:51
【问题描述】:
理论说,如果不调用等待,则父级不会获取有关已终止子级的信息,并且子级将成为僵尸。但是当我们创建一个进程时,即使我们没有调用等待,也不会创建僵尸。我的问题是是否会自动调用等待?
【问题讨论】:
-
没有。但请阅读advancedlinuxprogramming.com,其中有一整章专门讨论该问题......
标签: linux wait system-calls
理论说,如果不调用等待,则父级不会获取有关已终止子级的信息,并且子级将成为僵尸。但是当我们创建一个进程时,即使我们没有调用等待,也不会创建僵尸。我的问题是是否会自动调用等待?
【问题讨论】:
标签: linux wait system-calls
在许多语言中,调用子进程将为您调用wait()。例如,在 ruby 或 perl 中,您通常会这样处理:
#!/usr/bin/ruby
system("ls /tmp")
`ls /tmp`
这对你有很大的帮助,包括打电话给wait()。事实上,Ruby 必须等待进程退出以收集输出,然后程序才能继续运行。
您可以像这样轻松创建僵尸:
#!/usr/bin/ruby
if fork
sleep 1000 # Parent ignoring the child
else
exec "ls /tmp" # short-lived child
end
当我们手动 fork/exec 时,对我们来说没有魔法调用wait(),并且会创建一个僵尸。但是当父级退出时,僵尸子级将重新成为init 的父级,这将始终调用wait() 来清理僵尸。
【讨论】: