父进程未等待子进程终止:调用gnome-terminal后wait失效疑问
为什么
wait(NULL)在启动gnome-terminal后没有等待nano结束? 核心原因是你等待的进程根本不是nano,而是gnome-terminal本身:
- 当你通过
execvp执行gnome-terminal -- nano时,实际流程是:- 你的子进程(pid2对应的进程)启动
gnome-terminal程序; gnome-terminal会创建一个全新的终端窗口进程,并在这个窗口里启动nano;- 完成终端窗口的初始化后,
gnome-terminal进程会立即退出,不会等待窗口里的nano结束。
- 你的子进程(pid2对应的进程)启动
- 你的父进程调用
wait(NULL),等待的是pid2这个子进程(也就是gnome-terminal进程)。一旦gnome-terminal退出,wait就会返回,父进程立刻开始执行gcc命令,完全不会理会终端窗口里还在运行的nano。
对比你之前直接exec nano的场景:那时子进程本身就是nano进程,wait等待的就是nano,自然会等到你关闭nano才继续执行后续逻辑。
用system()打开终端的情况也是同理:system会创建一个shell进程,shell启动gnome-terminal后,gnome-terminal很快退出,shell进程也跟着结束,wait等的是shell进程,同样不会等待nano。
内容的提问来源于stack exchange,提问作者jim_bug
相关产品推荐
相关产品推荐

