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