PID 启动过程污染

PID Pollution by launching process

On nix/mac 如果我使用 nsiProcess 运行 或 运行Async 启动进程,启动进程 PID 会进入启动进程的文件(如锁定文件)等。

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

哦,这是显示我的截屏视频的 gif,它会循环一次,所以如果您想重复,只需刷新一下页面即可

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

在 unix 下,生成新进程通常首先 fork()ing the parent process and then replacing the child with a new process image in place through exec()

分叉导致新进程继承 - 除其他外 - 来自父进程的所有文件描述符。然后它可能会在调用 exec() 时丢弃其中的一些,但默认情况下不会这样做。请参阅 this SO answer 如何为执行时关闭标记文件描述符。

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