7

このcコードを使用して、2つの実行可能ファイルを連続して実行しようとしています:

#include <stdio.h>
#include <unistd.h>

int main (int argc, char *argv[])
{
    fork();
    execv("./prcs1", &argv[1]); // GIVE ADDRESS OF 2nd element as starting point to skip source.txt
    fork();
    execv("./prcs2", argv);
    printf("EXECV Failed\n");
}

fork にもかかわらず、プログラムは最初の execv() 呼び出しの後に終了し、2 番目の execv() に到達しません。最初のフォークの後に wait() を呼び出してみましたが、それが欠けているかどうかはわかりません。

子が終了した後に制御が親に戻らない理由はありますか?

4

4 に答える 4

20

いくつかの問題があります。まず、2 つのプログラムのみを実行する場合は、fork()1 回呼び出すだけで済みます。次に、親プロセスで 1 つのプログラムを実行し、子プロセスで 1 つのプログラムを実行します。次に、argv渡される配列をexecv正しく作成していません。最初のエントリは実行可能ファイル名にする必要があります。次のようにします。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    pid_t i = fork();
    if (i == 0)
    {
        execv("./prcs1", (char *[]){ "./prcs1", argv[1], NULL });
        _exit(1);
    }
    else if (i > 0)
    {
        execv("./prcs2", (char *[]){ "./prcs2", argv[0], NULL });
        _exit(2);
    }
    else
    {
        perror("fork failed");
        _exit(3);
    }
}

この例ではエラー チェックを行わないことに注意してください。

于 2013-10-02T21:52:46.523 に答える
6

fork() についてあまり読んでいないと思います。

を呼び出すとfork()、fork から同じコードを実行する子プロセスが作成されます。

fork()3種類の値を返します

  • エラーを示すネガティブ
  • あなたが親プロセスにいて、値が子プロセスIDを示していることを示すポジティブ
  • あなたが子プロセスにいると言うゼロ。

コードは次のようになります。

#include <stdio.h>
#include <unistd.h>

int main (int argc, char *argv[])
{

    int ret = fork();
    if(ret==0)
    {
       //child process
       execv("./prcs1", &argv[1]); // GIVE ADDRESS OF 2nd element as starting point to skip source.txt
       printf("EXECV Failed from child\n");
    }
    else if(ret>0)
    {
       //parent process
       execv("./prcs2", argv);
       printf("EXECV Failed from parent\n");
    }
    else
    {
       //you will come here only if fork() fails.
       printf("forkFailed\n");
    }
    return 0;
}
于 2013-10-02T21:58:03.343 に答える