我正在用c制作自定义外壳,但我不完全确定后台运行的进程如何工作。
我以为我抓地力很好,但是例如,我不确定文件描述符0会发生什么。
像'cat'这样的命令如果不带参数传递,则需要标准输入。
如果您在没有参数的情况下在后台运行cat(例如:cat&),它将立即终止。为什么这实际上发生了,猫的文件描述符0是否以某种方式关闭了?
我尝试通过将其文件描述符0设置为/ dev / null来处理此问题,但是cat抱怨文件描述符不好。
任何有关shell如何实际将stdin处理到后台进程的信息,将不胜感激!
更新:将fd 0设置为/ dev / null可行,但这是Shell实际起作用的吗? Shell是否将后台进程的文件描述符0设置为/ dev / null?如果是这样,如果移到前景,外壳会做什么,它将它设置回0吗? (顺便说一句,如果有多个进程,我将在管道中的第一个进程中执行此操作)
答案 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节有详细说明。