3

私はC ++の初心者であり、Linuxで同じディレクトリ内の別のプログラムを呼び出し、呼び出されたプログラムの出力をコンソールに表示せずに出力することになっている単純なプログラムに取り組んでいます。これは、私が取り組んでいるコード スニペットです。

    pid_t pid;
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;
    //int i=system("./Satzoo");
    if(pid=fork()<0)
        cout<<"Process could not be created..."<<endl;
    else
    {
        cout<<pid<<endl;
        execv("./Satzoo",NULL);
    }
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;

私が遭遇する問題の 1 つは、コンソールで最初の 2 行を印刷できるが、最後の 2 行を印刷できないことです。Satzoo プログラムを起動すると、プログラムが動かなくなったようです。もう 1 つのことは、このコードが Satzoo プログラムを 2 回呼び出すことです。理由はわかりません。画面に出力が 2 回表示されます。一方、execv() の代わりに system() を使用すると、Satzoo は 1 回しか機能しません。

プログラムで Satzoo の出力を読み取る方法がわかりません。

どんな助けでも大歓迎です。

ありがとう

4

5 に答える 5

12

の呼び出し後、子プロセスと親プロセスを区別していませんfork()。したがって、子と親の両方が実行execv()されるため、それぞれのプロセス イメージが置き換えられます。

次のようなものが必要です。

pid_t pid;
printf("before fork\n");

if((pid = fork()) < 0)
{
  printf("an error occurred while forking\n");
}
else if(pid == 0)
{
  /* this is the child */
  printf("the child's pid is: %d\n", getpid());
  execv("./Satzoo",NULL);
  printf("if this line is printed then execv failed\n");
}
else
{
  /* this is the parent */
  printf("parent continues execution\n");
}
于 2009-10-18T23:13:20.437 に答える
3

このfork()関数は現在のプロセスを複製し、各プロセスで異なる値を返します。「親」プロセスでは、子の pid を返します。子プロセスでは、ゼロを返します。したがって、通常は次のようなモデルを使用して呼び出します。

if (fork() > 0) {
    cout << "in parent" << endl;
} else {
    cout << "in child" << endl;
    exit(0);
}

上記ではエラー処理を省略しています。

あなたの例では、上記のコード パスの両方 (親と子の両方) が へのelse呼び出しの句に分類され、fork()両方がexecv("./Satzoo"). これが、プログラムが 2 回実行され、それ以上のステートメントに到達しない理由です。

すべてを手動で使用fork()および実行する代わりに (プロセスの実行を適切に管理することはかなりの作業量です)、popen()代わりに関数を使用することに興味があるかもしれません。

FILE *in = popen("./Satzoo", "r");
// use "in" like a normal stdio FILE to read the output of Satzoo
pclose(in);
于 2009-10-18T23:12:30.140 に答える
2

マンページからfork()

戻り
値 正常に完了すると、fork() は子プロセスに 0 を返し、子プロセスのプロセス ID を親プロセスに返します。両方のプロセスは、 fork() 関数から引き続き実行されます。それ以外の場合、-1 が親プロセスに返され、子プロセスは作成されず、エラーを示すために errno が設定されます。

成功することを確認しpidますが、子または親にいることを示しているかどうかは確認しません。したがって、子と親の両方が同じことを 2 回実行します。つまり、プログラムが 2 回実行され、終了テキストが出力されることはありません。fork()複数回の戻り値を確認する必要があります。

于 2009-10-18T23:14:12.703 に答える
1

exec-exec()ファミリーの関数は、現在のプロセスイメージを新しいプロセスイメージに置き換えます。

system-コマンドの実行をブロックします。システムコマンドが戻った後も、呼び出し側プログラムの実行は続行されます

于 2009-10-18T23:54:34.333 に答える
0

fork で必要な 3 つの戻り値テストがあります

  1. 0: あなたは子供です
  2. -1: エラー
  3. その他:あなたは親です

子と親の両方から他のプログラムを実行しました...

于 2009-10-18T23:13:10.867 に答える