GNU+Linux下调用exit()是否会关闭启动程序的终端窗口?
GNU+Linux下
exit(1)是否会关闭启动程序的终端窗口? 问题背景
在GNU+Linux系统中,通过./program运行C程序时,程序调用exit(1)后,启动它的终端窗口也跟着关闭了。推测原因是exit()关闭了进程的所有文件描述符,而终端是程序的STDOUT(文件描述符1),所以被连带关闭。已知exit()会销毁自身进程及子进程、关闭所有打开的文件描述符。
核心结论
程序调用exit(1)不会直接关闭终端窗口。
详细解释
- 终端窗口是独立的进程(比如
gnome-terminal、konsole这类终端模拟器),你的C程序只是终端启动的shell的子进程,两者属于不同的进程层级,exit()只会终止自身进程和它的子进程,影响不到终端进程。 - 程序的
STDOUT/STDIN只是指向终端设备的文件描述符,exit()关闭这些描述符只是断开程序和终端的连接,相当于“切断了程序和终端的对话管道”,但终端本身的进程依然在运行,不会被关闭。
终端窗口关闭的真实可能原因
- 终端模拟器开启了“执行命令后自动关闭窗口”的选项:有些终端可以设置启动程序后,等程序结束就自动关闭窗口,这和
exit()无关,是终端的配置问题。 - shell配置导致退出:如果你的shell(比如bash)被设置为当最后一个子进程退出时自动退出,那么shell结束后,终端窗口会跟着关闭。
- 程序触发了终端异常:比如程序向终端发送了非法的控制序列,导致终端进程崩溃,但这属于程序的其他行为,和
exit(1)本身没有关系。
内容的提问来源于stack exchange,提问作者Kevin Stefanov
相关产品推荐
相关产品推荐

