Shell 作业控制:使用 WNOHANG 等待跟踪后台状态

Shell Job Control: Track status of background with WNOHANG wait

这一行(来自 here)的 GNU 是什么意思?

The shell must also check on the status of background jobs so that it can report terminated and stopped jobs to the user; this can be done by calling waitpid with the WNOHANG option.

我不明白为什么 shell 应该在执行前提醒用户有关后台进程的信息。那会是什么样子呢?例如,调用 ls,但后台进程已完成,因此该进程的状态会在 ls 之前打印出来?

它用于为后台作业实施如下通知:

$ cmd_1 &
$ cmd_2
$ cmd_3
[1]+  Done                    cmd_1
$

sleep 5 之类的东西是很好的 cmd_1 来尝试一下。)

在上面,假定后台 cmd_1 作业在输入 cmd_3 或 运行 时完成。通知在之后发送,就在打印上面最后一个提示之前。

waitpid(2) 用于等待进程更改状态(终止或停止或启动,例如 Ctrl-Zfg 所做的)。

要实现上面的显示,shell可以调用waitpid(2)来检查后台作业是否每次在提示输入新命令之前改变状态。如果它在不传递 WNOHANG 的情况下执行此操作,那么 waitpid() 调用将阻塞,直到后台作业实际更改状态,这意味着 shell 将被卡住,直到 cmd_1 在打印之前完成第二个提示。 WNOHANG 使 waitpid() 调用成为非阻塞调用,并允许 shell 到 "poll" 代替作业中的状态更改。