我写了一个简单的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 -- ...
的一个问题。
我也用xterm -e
替换了gnome-terminal --
,但事情是一样的。
有没有办法在新终端窗口中打开一个运行a.out
的新终端,并使firefox
成为孤儿?(我知道如何在新终端中执行a.out
,并在a.out
返回后保留新终端,但我想退出新终端并保持firefox
为孤立(.
Firefox被SIGHUP
杀死,因为当gnome-terminal
或xterm
退出时,它的控制终端会消失。你有两个选项可以阻止这种情况:
- 执行
nohup
的操作:通过在execl
之前执行signal(SIGHUP, SIG_IGN);
,将Firefox设置为忽略SIGHUP
- 在
execl
之前执行setsid()
,这样进程就不会有控制终端。注意,如果open
由于某种原因发生这种情况,这可能会导致Firefox稍后突然获取控制终端