提问人:Kevin Stefanov 提问时间:9/3/2023 更新时间:9/3/2023 访问量:70
exit() 会杀死生成进程的终端吗?
Does exit() kill the terminal from which the process was spawned?
问:
在 GNU+Linux 上,如果我用 运行一个 C 程序,并在某个时候调用 ,该调用会关闭生成该程序的终端窗口吗?因为我遇到了一些错误,当我回来时,终端窗口不见了。我的猜测是我的程序遇到了我响应的错误之一,这也关闭了终端窗口?我确实知道这会破坏调用它的进程及其所有子进程,并关闭进程当前打开的所有文件描述符。./program
exit(1)
exit()
exit()
exit()
exit()
我可能有一种解释(我不确定是否正确),为什么当我检查我的程序时终端消失了,是我们键入以运行它的终端窗口变成了这个进程',这是默认分配的文件描述符。并且由于关闭了所有文件描述符,因此它还关闭了我运行程序的终端窗口?./program
STDOUT
1
exit()
答:
没有“正确”的行为,其他进程(例如进程的父进程)的反应方式取决于环境(并且不能由C标准指定)。
通常;使用“命令行”时,有 3 个不同的部分:终端(或终端仿真器);在终端内运行的 shell(例如,也许);和 none,一个或多个进程在 shell 下运行。对于“类似 POSIX”的环境,当您的进程终止时,其父进程会发送一个 SIGCHLD 信号,如果父进程是某种 shell,它将通过恢复某种提示并等待输入另一个命令来处理 SIGCHLD 信号。bash
然而;通常没有 shell,它只是一个裸露的(虚拟)终端。这在 GUI 启动控制台应用程序时最为常见,因为 GUI 环境没有/使用 stdin 或 stdout。为了解决这个问题,GUI 将启动一个终端仿真器来创建控制台应用程序期望的 stdin/stdout,然后当控制台应用程序终止时,终端仿真器无事可做(它没有 shell 或任何东西),因此它也会终止。当然,这可能很方便,也可能不方便,通常 GUI 的终端仿真器具有命令行开关,用于“当子窗口终止时不要关闭窗口”功能。
一个(“随机”选择的)例子是 Konsole(作为 KDE 一部分的终端模拟器);其中命令行选项或将告诉终端仿真器不要自动关闭。--hold
--noclose
评论
man
exit()
破坏了调用它的进程“是不真实的。exit
exit