exit() 会杀死生成进程的终端吗?

Does exit() kill the terminal from which the process was spawned?

提问人:Kevin Stefanov 提问时间:9/3/2023 更新时间:9/3/2023 访问量:70

问:

在 GNU+Linux 上,如果我用 运行一个 C 程序,并在某个时候调用 ,该调用会关闭生成该程序的终端窗口吗?因为我遇到了一些错误,当我回来时,终端窗口不见了。我的猜测是我的程序遇到了我响应的错误之一,这也关闭了终端窗口?我确实知道这会破坏调用它的进程及其所有子进程,并关闭进程当前打开的所有文件描述符。./programexit(1)exit()exit()exit()exit()

我可能有一种解释(我不确定是否正确),为什么当我检查我的程序时终端消失了,是我们键入以运行它的终端窗口变成了这个进程',这是默认分配的文件描述符。并且由于关闭了所有文件描述符,因此它还关闭了我运行程序的终端窗口?./programSTDOUT1exit()

C Linux UNIX 终端 操作系统

评论

0赞 Ted Lyngmo 9/3/2023
我不确定对这个问题的正确回答是什么。引用页面?man
0赞 Weather Vane 9/3/2023
"exit()破坏了调用它的进程“是不真实的。
0赞 Ted Lyngmo 9/3/2023
您的观察结果和您想要发生的事情可能需要澄清。
0赞 William Pursell 9/3/2023
@WeatherVane我相信 OP 意味着调用会终止调用 .exitexit
2赞 pmacfarlane 9/3/2023
似乎你可以尝试一下,看看,使用 C 程序,您可以在大约一分钟内编写。

答:

2赞 Brendan 9/3/2023 #1

没有“正确”的行为,其他进程(例如进程的父进程)的反应方式取决于环境(并且不能由C标准指定)。

通常;使用“命令行”时,有 3 个不同的部分:终端(或终端仿真器);在终端内运行的 shell(例如,也许);和 none,一个或多个进程在 shell 下运行。对于“类似 POSIX”的环境,当您的进程终止时,其父进程会发送一个 SIGCHLD 信号,如果父进程是某种 shell,它将通过恢复某种提示并等待输入另一个命令来处理 SIGCHLD 信号。bash

然而;通常没有 shell,它只是一个裸露的(虚拟)终端。这在 GUI 启动控制台应用程序时最为常见,因为 GUI 环境没有/使用 stdin 或 stdout。为了解决这个问题,GUI 将启动一个终端仿真器来创建控制台应用程序期望的 stdin/stdout,然后当控制台应用程序终止时,终端仿真器无事可做(它没有 shell 或任何东西),因此它也会终止。当然,这可能很方便,也可能不方便,通常 GUI 的终端仿真器具有命令行开关,用于“当子窗口终止时不要关闭窗口”功能。

一个(“随机”选择的)例子是 Konsole(作为 KDE 一部分的终端模拟器);其中命令行选项或将告诉终端仿真器不要自动关闭。--hold--noclose