1

私は自分のUNIX端末を書いていますが、コマンドを実行する際に問題が発生しています:

まず、ユーザー入力を取得してバッファーに格納し、次に単語を分離して argv[] 配列に格納します。つまり、argv[0] に格納されている firefox を起動するコマンドは「firefox」です。

コマンドを起動するにはどうすればよいですか? これは私がやろうとしていることですが、エラーが発生しています:

void launchProcess(char *command[], char *file){
        pid_t pid;
        pid = fork();
        if (pid == -1) {
                perror("Error when forking");
                exit(EXIT_FAILURE);
        }
        if (pid == 0){                  
                fprintf(stderr, "Child pid = %d\n", getpid());
                execv(file, command);
            }

私が電話するとき:

launchProcess(commandArgv, "STANDARD");

次のエラーが表示されます: エラー: launchProcess のタイプが競合しています

4

3 に答える 3

8

競合する型エラーがある場合は、リストした関数がその宣言と同じ型であることを確認する必要があります。

また、おそらく既にご存知でしょうがexecv、実行可能ファイルへの完全修飾パスが必要なので、「STANDARD」のような値は機能しません。変数を使用してバイナリの場所を決定するexecvp場合に使用します。また、配列PATHの最後の値が であることを確認する必要があります。最後に、 ;の戻り値を確認してください。たとえば、ユーザーが存在しないプログラムを実行しようとすると、失敗する可能性が明確にあります。argvNULLexecv

于 2009-09-23T02:51:40.407 に答える
2

関数のプロトタイプを作成する必要があります: 「void launchProcess(char *command[], char *file);」を追加します。あなたの主な機能の上。

データ型は正しいように見えますが、パラメーター名「ファイル」と「コマンド」に基づいて、関数を間違った方法で使用しているようです。

以下は、引数なしで ls 関数を実行する例です。

char *args[] = {NULL}; execv("/bin/ls", args);

于 2009-09-23T03:31:24.023 に答える
1

exec と wait に関するこれらのメモは、いくつかの助けになるかもしれません。

于 2009-09-23T03:08:38.220 に答える