gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:38:10 26 4
gpt4 key购买 nike

我正在用 c 语言制作一个自定义 shell,但我不完全确定后台运行的进程是如何工作的。

我认为我掌握得很好,但我不确定例如文件描述符 0 会发生什么。

像“cat”这样的命令,当不带参数传递时,需要来自标准输入的输入。

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

我尝试通过将其文件描述符 0 设置为/dev/null 来处理此问题,但随后 cat 提示文件描述符错误。

任何有关 shell 如何实际处理后台进程的标准输入的信息将不胜感激!

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

最佳答案

以下是我在后台运行 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 节。

关于linux - 为什么像 cat 这样的命令在后台运行时会立即退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56205341/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com