【问题标题】:PID Pollution by launching process [closed]启动过程造成的PID污染[关闭]
【发布时间】:2015-02-27 20:17:38
【问题描述】:

在 nix/mac 上,如果我使用 nsiProcess run 或 runAsync 启动进程,启动进程 PID 会进入启动进程的文件(如锁定文件)等。

这个 gif 显示我有一个个人资料。我对 parentlock 文件执行 lsof,它显示一个 pid。然后我启动第二个配置文件,它现在显示其中一个 parentlock 文件现在有多个 pid。关于如何避免这种 pid 污染的任何想法?通过我可以使用的 nsiprocess 或 jsctypes/libc 方法?

哦,这是显示我的截屏视频的 gif,它会循环一次,所以如果你只想重复一次简单的页面刷新

http://i.imgur.com/OsuGbqB.gif

【问题讨论】:

  • 你有两个独立的进程在运行,(两个 firefox 实例),所以它将有两个 PID —— 每个一个。
  • 但问题是第二个 pid 不应该在另一个的 .parentlock 文件上:(
  • 你为什么要为 .parentlock grepping lsof 呢?为什么不ps axcps aux
  • 不确定它是否正常工作:P 但它在通过 PID 聚焦窗口时发挥作用,这就是我喜欢 lsof 的原因。它显示存在问题。我现在测试 ps axc 和 aux。

标签: linux macos shell firefox-addon


【解决方案1】:

在 unix 下生成一个新进程通常是首先通过fork()ing 父进程,然后通过exec() 将子进程替换为就地的新进程映像。

分叉导致新进程从父进程继承所有文件描述符。然后它可能会在调用exec() 时摆脱其中的一些,但默认情况下不会这样做。请参阅this SO answer 如何标记文件描述符以进行 close-on-exec。

  • 如果您可以控制生成的进程,您只需找到有问题的描述符并关闭它。
  • 如果你不这样做,那么你必须编写一个可执行文件来标记close-on-exec的描述符(见上文),然后调用exec()来最终启动你真正想要的子进程。
    • 编辑:正如 cmets 中所指出的,现有的程序可以做到这一点

【讨论】:

  • 非常感谢这个很棒的答案。我解决这个问题的方法是使用nsIProcess/usr/bin/open 启动这些参数:open -a "/Applications/Firefox.app" --args -profile "blah blah" -no-remote 这个luanchers firefox 并关闭,所以没有pid 污染。你的解决方案虽然帮助我理解了很多,所以非常感谢你!
  • 嘿伙计,我无法发布解决方案,因为他们关闭了主题。但是/usr/bin/open 只是或者Mac,Nix 没有,所以我不得不使用Gio 来使用g_app_info_launch_uris 复制粘贴在这里看到:GitHubGIST :: Noitidart / _ff-addon-snippet-GioLaunch.js
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
相关资源
最近更新 更多