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