2

Windows で実行/コンパイルしたい Unix ツールを受け取りました。それを見た後、それが使用されていることがわかりforkますexecv。私は今、それが何をするのか、そして 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() 関数は、現在のプロセス イメージを新しいプロセス イメージに置き換え、渡された引数で Java プログラムを実行します。

子プロセスがゾンビ プロセス (親のない子) にならないように、親プロセスは子プロセスの完了を待つ必要があります。

于 2012-08-17T18:14:41.617 に答える
3

execvが戻らず、最初にフォークしないとプログラムが終了しません。これは正しいです?

実際、あなたのプログラムはそれ自体をexec'dプログラムに変えます。つまり、実行後、新しいプログラムの実行が開始されますが、プロセスは同じです。同じPID、同じ少数の継承されたプロパティなどです。

于 2012-08-13T14:58:54.227 に答える