V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
xiadada
V2EX  ›  Linux

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

  •  
  •   xiadada · 2018-06-29 16:24:31 +08:00 · 4023 次点击
    这是一个创建于 1250 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    请问这是怎么回事?谢谢

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

    似乎 lz 以为 iterm2 开个窗就是一个 session ?
    xiadada
        18
    xiadada   2018-07-03 16:15:49 +08:00
    @GeruzoniAnsasu 确实是这么认为的....
    xiadada
        19
    xiadada   2018-07-03 16:17:03 +08:00
    @jadec0der 额, 我以为在一个窗口里开的都是属于一个 session 的..我再去学习一下
    xiadada
        20
    xiadada   2018-07-03 16:19:01 +08:00
    @zdkmygod 谢谢啊, 我一直以为在一个窗口下跑的程序都是一个 session
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3114 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:25 · PVG 18:25 · LAX 02:25 · JFK 05:25
    ♥ Do have faith in what you're doing.