首页 > 解决方案 > "gnome-terminal --" 退出并终止所有分叉

问题描述

我写了一个简单的 C 程序来创建孤儿进程:

int main(){
  int pid = fork();
  if(pid == 0){
      execl("/usr/bin/firefox", "firefox", (char*)0);
  }else{
      sleep(2);
      return 0;
  }
}

我将此文件编译为a.out并在终端中运行以下命令:

gnome-terminal -- ./a.out

这会打开一个新的终端firefox,但 2 秒后终端退出并firefox终止,但我想firefox成为终端退出的孤儿进程。

我的程序是正确的,因为当我尝试

./a.out

直接在终端中firefox打开,当我手动关闭当前终端时,firefox它仍然存在。所以一定是个问题gnome-terminal -- ...

我也替换gnome-terminal --xterm -e,但事情是一样的。

有没有办法a.out在新终端窗口中运行打开一个新终端并创建firefox一个孤儿?(我知道如何a.out在新终端中执行并在返回后保留新终端a.out,但我想退出新终端并保留firefox一个孤儿) .

标签: forkgnome-terminalorphan-process

解决方案


Firefox 正在被杀死,因为它的控制终端在或退出SIGHUP时消失。您有两种选择来阻止这种情况:gnome-terminalxterm

  1. 做什么:nohup在你的.SIGHUPsignal(SIGHUP, SIG_IGN);execl
  2. 在你setsid()之前execl做,这样该过程就没有控制终端。请注意,如果由于open某种原因发生在某个终端上,这可能会导致 Firefox 稍后突然获取控制终端。

推荐阅读