【问题标题】:Windows, fork and execvWindows、fork 和 execv
【发布时间】:2012-08-09 20:02:47
【问题描述】:

我收到了一个想要在 Windows 下运行/编译的 Unix 工具。看了之后,我发现它使用了forkexecv 等等。我现在想了解它的作用以及如何在 Windows 中实现这一点。

代码的作用不止于此,因此请不要评论此代码是否有意义。

pid = fork();
if(pid==0){
    execv("/usr/bin/java",args);
}

如果我正确地解释了这一点,那么它只会使用args 数组中提供的参数调用java。因此,在 Windows 中,这可以通过 system()CreateProcess 之类的方式轻松实现(我没有阅读如何 这样做,只是知道可以做到)。

但这是我的问题:如果我理解正确,这段代码会分叉并调用execv,因为execv 不会返回,如果不先分叉,我的程序将无法完成。这是正确的吗?

【问题讨论】:

    标签: c windows unix


    【解决方案1】:

    execv 不返回,我的程序也不会 完成而不先分叉。这是正确的吗?

    实际上,您的程序会将自己变成执行程序。 IE。在 exec 之后,新程序将开始执行,但过程是相同的:相同的 PID,相同的几个继承属性等。

    【讨论】:

    • 如果我刚刚创建了一个流程,是否有任何可以定义的相关内容不起作用? java 是否需要从我的进程中继承它需要工作的任何东西(仅供参考:这些工具也使用 unix 管道,但可能完全不相关)?
    • @javex 我不确定你在问什么。无论你是否 fork,新创建的进程都会继承一些东西。
    • 好的,谢谢 - 我会自己解决,感谢您的帮助
    【解决方案2】:

    fork 创建一个子进程,它的 pid 与父 pid 不同。在您的代码中,您正在调用 fork 来运行另一个进程而不关闭当前(父)进程。

    在调用 fork 并进入子进程后,我们调用 execv(); execv() 函数用一个新的进程映像替换当前进程映像,它会执行带有 args 传递的 java 程序。

    父进程必须等待子进程完成,这样子进程才不会变成僵尸进程(没有父进程的子进程)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-14
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      相关资源
      最近更新 更多