1

execvp仕組みと同じように仕事をするのに苦労してsystem()います。

コードを使用する場合:

int cstatus; /* Exit status of child. */
pid_t cpid; 
switch (cpid = fork ()) {
case -1:
    printf("fork");
case 0: // child
    system("./file");
            printf("child->");
default:
    pid_t tpid = wait(&cstatus);
            printf("parent\n");
}

期待どおりに./file実行され、印刷されますchild->parent

しかし、次のようにプログラムを実行しようとすると:

int cstatus; /* Exit status of child. */
pid_t cpid; 
switch (cpid = fork ()) {
case -1:
    printf("fork");
case 0: // child
    execvp("file", NULL);
            printf("child->");
default:
    pid_t tpid = wait(&cstatus);
            printf("parent\n");
}

の出力が得られますが、コマンド プロンプトでchild->parentparentファイルに (から生成された) 出力が表示されません。file

ここで何か間違ったことをしていますか?私は基本的fileに、フォアグラウンドで実行し、親が完了するまで待機させようとしています。

4

4 に答える 4

0

違うのは、execvp()失敗した時以外は返さないが、system()必ず返すという部分です。というわけでsystem()、交換用(カバー機能)ですfork + exec。現在のディレクトリが PATH 上にあるかどうかも考慮する必要があります。

于 2013-11-14T02:23:41.027 に答える
0

break;各ケース ブロックの最後でミスしました。

そして、あなたが execvp に間違った引数を提供していないことを見落としていました。

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

.
.
char *argv2[2];
.
.
case 0: // child
    argv2[0] = "file";
    argv2[1] = NULL;
    execvp("file", argv2);
    printf("child->");
    break;
.
.
于 2013-11-14T02:36:45.050 に答える
0

ディレクトリがPATH環境変数に追加されているかどうかを確認します

echo $PATH

ファイルを含むディレクトリが にリストされていないPATH場合は、追加する必要があります。

PATH=$PATH:/myDirectory
于 2013-11-14T03:43:43.763 に答える