在 mac 下创建了一个孤儿进程, 彻底关闭 terminal, 进程还存在

2018-06-29 16:24:31 +08:00
 xiadada

我理解的孤儿进程是成为后台守护进程的前提, 守护进程增加了创建单独一个 session 的步骤, 这样在 session 关闭的时候, 就不会在杀死他.

但是我在 Macos 下测试的时候, 弄出来一个孤儿进程之后, 吧 iTerm2 完全关闭(杀死 session), 然后再打开, 发现这个进程还是存在.

请问这是怎么回事?谢谢

4770 次点击
所在节点    Linux
20 条回复
neoblackcap
2018-06-29 16:39:44 +08:00
孤儿进程你又不关,又不属于你的,这个留着有什么问题?这是正常现象啊,你要关闭的话,kill -9 就可了
xiadada
2018-06-29 16:40:40 +08:00
@neoblackcap 拿他跟后台进程有什么区别
xiadada
2018-06-29 16:41:30 +08:00
@xiadada 打错字, 和守护进程有什么区别
neoblackcap
2018-06-29 16:43:28 +08:00
@xiadada 你是说 daemon 吗?你的做法就是对的啊 fork 两次,关闭各种文件描述符,还有创建 session 嘛。守护进程就是这样,关闭大多都是靠信号,没看出你想问什么。
xiadada
2018-06-29 16:47:26 +08:00
我想问为什么要创建 session? 书上说最关键的一步就是创建这个东西
neoblackcap
2018-06-29 17:02:40 +08:00
@xiadada 你不创建 session 以及成为 session leader,那么就会继承原来的 session。那么该 session 收到 SIGHUP,你这个子进程也会收到 SIGHUP,那么就乱套了。
Nitroethane
2018-06-29 17:03:23 +08:00
孤儿进程之所以叫孤儿进程是因为父进程先于子进程结束。在 Linux 下孤儿进程会被 init 进程收养,孤儿进程的父进程变为 init 进程。macOS 下也是被 launchd 收养。“发现这个进程还是存在”,肯定存在呀,除非自己终止或者手动 kill 掉他。
dorothyREN
2018-06-29 17:06:31 +08:00
孤儿进程。。。父进程肯定挂了啊,父进程还在的话就不叫孤儿进程了
xiadada
2018-06-29 17:27:44 +08:00
那我的问题变成了我在 iTerm2 中断里创建的这个孤儿进程, 那不应该是属于 iTerm2 创建的 Session 吗? 我把 iTerm2 杀死,为什么这个子进程还能存在, 不应该被 iTerm2 杀死吗?
xiadada
2018-06-29 17:28:28 +08:00
@neoblackcap
@Nitroethane
@dorothyREN
我想通过杀死 session 来杀死他, 怎么做? 不是杀死 shell 吗?
lance6716
2018-06-29 18:10:57 +08:00
请学习 apue
jadec0der
2018-06-29 19:07:33 +08:00
能给一下你的具体步骤么,你怎么确定孤儿进程和 iterm 是同一个 session 的?
iwtbauh
2018-06-29 19:27:50 +08:00
@Nitroethane #7
3.4 以后的 Linux 引入了 subreaper (子收割者?)的概念,进程调用 prctl PR_SET_CHILD_SUBREAPER 后,由调用者领养其后代的所有孤儿进程并履行 init(1)的职责,不知道 macos 有没有类似的机制。
neoblackcap
2018-06-29 20:07:56 +08:00
@xiadada 我不是很明白你到底想写什么程序。你想写守护进程请先读 APUE。你若是想写一个单纯的后台运行程序非守护进程的话,那你应该用&让它在后台跑,不堵塞你的 shell,不要想那么多乱七八糟的。你不同的 session 怎么可能能通过一个信号去实现你的目的。
zdkmygod
2018-06-29 22:45:38 +08:00
>我理解的孤儿进程是成为后台守护进程的前提, 守护进程增加了创建单独一个 session 的步骤, 这样在 session 关闭的时候, 就不会在杀死他.
你理解是错误的,孤儿进程就是你想要的后台守护进程,没有啥区别。或者换句话来说,设置一个进程为守护进程是为了确保当我们 kill 掉这个进程所在的 terminal 的 session 的时候这个进程能够变成孤儿进程,而不是直接被发过来的 hup 信号终止掉。
Mitt
2018-06-30 01:25:32 +08:00
你可能对 session 和 iterm2 的作用有什么误解
GeruzoniAnsasu
2018-06-30 01:30:16 +08:00
你可能对 session 和 iterm2 的作用有什么误解 +1

似乎 lz 以为 iterm2 开个窗就是一个 session ?
xiadada
2018-07-03 16:15:49 +08:00
@GeruzoniAnsasu 确实是这么认为的....
xiadada
2018-07-03 16:17:03 +08:00
@jadec0der 额, 我以为在一个窗口里开的都是属于一个 session 的..我再去学习一下
xiadada
2018-07-03 16:19:01 +08:00
@zdkmygod 谢谢啊, 我一直以为在一个窗口下跑的程序都是一个 session

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/466891

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX