在 mac 下创建了一个孤儿进程, 彻底关闭 terminal, 进程还存在 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
xiadada
V2EX    Linux

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

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

    我理解的孤儿进程是成为后台守护进程的前提, 守护进程增加了创建单独一个 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  
    OP
       2018-06-29 16:40:40 +08:00
    @neoblackcap 拿他跟后台进程有什么区别
    xiadada
        3
    xiadada  
    OP
       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  
    OP
       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  
    OP
       2018-06-29 17:27:44 +08:00
    那我的问题变成了我在 iTerm2 中断里创建的这个孤儿进程, 那不应该是属于 iTerm2 创建的 Session 吗? 我把 iTerm2 杀死,为什么这个子进程还能存在, 不应该被 iTerm2 杀死吗?
    xiadada
        10
    xiadada  
    OP
       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  
    OP
       2018-07-03 16:15:49 +08:00
    @GeruzoniAnsasu 确实是这么认为的....
    xiadada
        19
    xiadada  
    OP
       2018-07-03 16:17:03 +08:00
    @jadec0der 额, 我以为在一个窗口里开的都是属于一个 session 的..我再去学习一下
    xiadada
        20
    xiadada  
    OP
       2018-07-03 16:19:01 +08:00
    @zdkmygod 谢谢啊, 我一直以为在一个窗口下跑的程序都是一个 session
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2719 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 12:10 PVG 20:10 LAX 05:10 JFK 08:10
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86