为什么像cat这样的命令在后台运行时会立即退出?

时间:2019-05-19 06:33:43

标签: linux bash shell

我正在用c制作自定义外壳,但我不完全确定后台运行的进程如何工作。

我以为我抓地力很好,但是例如,我不确定文件描述符0会发生什么。

像'cat'这样的命令如果不带参数传递,则需要标准输入。

如果您在没有参数的情况下在后台运行cat(例如:cat&),它将立即终止。为什么这实际上发生了,猫的文件描述符0是否以某种方式关闭了?

我尝试通过将其文件描述符0设置为/ dev / null来处理此问题,但是cat抱怨文件描述符不好。

任何有关shell如何实际将stdin处理到后台进程的信息,将不胜感激!

更新:将fd 0设置为/ dev / null可行,但这是Shell实际起作用的吗? Shell是否将后台进程的文件描述符0设置为/ dev / null?如果是这样,如果移到前景,外壳会做什么,它将它设置回0吗? (顺便说一句,如果有多个进程,我将在管道中的第一个进程中执行此操作)

1 个答案:

答案 0 :(得分:3)

当我在后台运行cat时,会发生以下情况:

$ cat&
[1] 19322
$ 

[1]+  Stopped                 cat
$

请注意,cat进程尚未终止。它已被暂停。

$ jobs
[1]+  Stopped                 cat
$ ps u 19322
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
rici     19322  0.0  0.0  11788   784 pts/4    T    01:48   0:00 cat

后台任务无法从终端设备读取。当他们尝试这样做时,他们会收到SIGTTIN信号。与该信号关联的默认操作是停止任务。但是它还没有终止。您仍然可以通过将其放回前台来对其进行复苏:

$ fg
cat
Hello, world!
Hello, world!

APUE的第9.8节有详细说明。