fork - "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
一个孤儿) .
解决方案
Firefox 正在被杀死,因为它的控制终端在或退出SIGHUP
时消失。您有两种选择来阻止这种情况:gnome-terminal
xterm
- 做什么:
nohup
在你的.SIGHUP
signal(SIGHUP, SIG_IGN);
execl
- 在你
setsid()
之前execl
做,这样该过程就没有控制终端。请注意,如果由于open
某种原因发生在某个终端上,这可能会导致 Firefox 稍后突然获取控制终端。
推荐阅读
- javascript - 使用 Angular 在 HTML 上编写元素引用
- kotlin - IntelliJ 不会根据 ktlint 的期望对 Kotlin 导入进行排序
- machine-learning - 不同的成本函数利弊
- python - 如何使用 Jupyter 笔记本将 txt 文件插入 sklearn
- c# - .NET 4.7.x 中的 .NET 反射比 3.5 慢 3 倍
- javascript - 导航 json 对象图的建议
- javascript - TypeError:无法读取未定义的属性“发送”?
- c# - 2 个 Visual Studio 启动 2 个不同的 IIS Express 服务器
- ios - 为什么我可以播放我的 app bundle 中的视频,但不能播放下载到文件系统的视频?
- php - 未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;