2

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

该代码的功能不止于此,因此请不要评论此代码是否有意义。

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

如果我正确地解释了这一点,那么这个只会做一些事情,比如使用数组java中提供的参数进行调用。args所以在 Windows 中,这可以很容易地通过类似system()or的东西来实现CreateProcess(我没有读过如何做到这一点,只知道它可以做到)。

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

4

2 回答 2

4

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

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

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

于 2012-08-17T18:14:41.617 回答
3

execv 不返回,如果不先分叉,我的程序将无法完成。它是否正确?

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

于 2012-08-13T14:58:54.227 回答