V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fyyz
V2EX  ›  C++

请问用 Boost::Process 库在 Windows 下如何使子进程在父进程退出后自动退出?

  •  
  •   fyyz · 2019-12-23 09:35:26 +08:00 · 3661 次点击
    这是一个创建于 1557 天前的主题,其中的信息可能已经有所发展或是发生改变。
    windows 的 CreateProcess() 能配合 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 使用,实现该功能。
    Boost::Process 有什么方法能做到吗?
    补充:我没有子进程源码,无法修改子进程的可执行文件。
    7 条回复    2019-12-23 11:01:13 +08:00
    augustheart
        1
    augustheart  
       2019-12-23 09:39:45 +08:00
    没用过这个,不过研究一下能不能直接用 api 不行么?
    geelaw
        2
    geelaw  
       2019-12-23 09:48:19 +08:00 via iPhone
    根据 2017 年的讨论 boost 没有实现该功能。

    https://github.com/klemens-morgenstern/boost-process/issues/66

    你需要自行用 Windows job control 实现。

    为什么 boost 没有该功能?一个简单的原因是 POSIX 中似乎没有这样的 API。
    ysc3839
        3
    ysc3839  
       2019-12-23 10:05:04 +08:00 via Android
    有个非正规的做法是把进程自己也加入 job 中,这样自己的子进程也会自动加入 job。
    fengjianxinghun
        4
    fengjianxinghun  
       2019-12-23 10:16:17 +08:00
    @geelaw Linux 有 prctl(PR_SET_PDEATHSIG, SIGHUP, 0, 0, 0);
    geelaw
        5
    geelaw  
       2019-12-23 10:24:49 +08:00 via iPhone
    @ysc3839 #3 这需要假设进程是用 CreateProcessEx 建立的(我觉得 boost 应该是),此外还要在 job 里不允许子进程离开 job。

    @fengjianxinghun #4 我说的是 POSIX,不是 Linux。
    shilyx
        6
    shilyx  
       2019-12-23 10:32:36 +08:00
    boost 几乎不可能包括 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 的功能,因为里面有些坑,boost 也没法从框架上解决。还是自己做吧,反正也是 windows 平台。
    ysc3839
        7
    ysc3839  
       2019-12-23 11:01:13 +08:00 via Android
    @geelaw 应该不需要某个特定 API 才能生效的,不然的话不是能轻易绕过 job 限制?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   972 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:46 · PVG 04:46 · LAX 13:46 · JFK 16:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.