c ++ fork()およびexecv()の問題
質問
私は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は一度だけ動作します。
私のプログラムでSatzooの出力を読む方法を理解していません。
どんな助けも感謝しています。
ありがとう
解決
電話後の子供と親のプロセスを区別していません 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");
}
他のヒント
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);
から fork()
マンページ:
返品値
正常に完了すると、fork()は0を子プロセスに戻し、子プロセスのプロセスIDを親プロセスに返すものとします。両方のプロセスは、fork()関数から引き続き実行されます。それ以外の場合、-1は親プロセスに返され、子プロセスは作成されず、errnoはエラーを示すように設定するものとします。
あなたはそれが成功することを確認するためにチェックしますが、 pid
私たちが子供または親の中にいることを示します。したがって、子と親の両方が同じことを2回行うことになります。つまり、プログラムは2回実行され、エンドテキストが印刷されないことを意味します。の返品値を確認する必要があります fork()
一度以上。
exec -exec()ファミリーの関数は、現在のプロセス画像を新しいプロセス画像に置き換えます。
システム - コマンドの実行をブロックします。システムコマンドが返された後、呼び出しプログラムの実行は継続されます
フォークで必要な3つの返品値テストがあります
- 0:あなたは子供です
- -1:エラー
- その他:あなたは親です
あなたは子供と親の両方から他のプログラムを実行しました...