1. ホーム
  2. c

[解決済み] exec、execvp、execl、execvの違い?

2022-03-03 02:22:40

質問

私はLinuxに新しいシェルを表現するコードを書いています。私がサポートしたいコマンドの1つは、プロセスを実行することです。 例えば、次のような行があるとします。

command [arguments]

それから、私は実行したい command をプロセスの実行が終了するまで、プロセスとして実行します。

そのためには、私が知っているのは fork() 子プロセスを取得し、そのPIDを取得するために、私の問題は、私は.NET Frameworkの違いが何であるかを知らないことである。

exec , execvp , execl , execv ...そして、どれを使えばいいのか、なぜ使うのかがわからない。

私の現在のコード.

void External_Process(char *arguments[MAX_ARG], char* command)
{
    int pID;
    switch(pID = fork())
    {
    case -1:
        perror("fork failed");
        break;
    case 0 :
        setpgrp();

        //execv(command, arguments);
        //execvp(command, arguments);
        //execl("/bin/bash", "/bin/bash","-c",command,NULL);

        printf("smash error: > bad command %s\n" , command);
        exit(-1) ;

        break;

    default:
        return ;
    }
}

ありがとうございました。

解決方法は?

概要 あなたの場合、私は以下のように使用することをお勧めします。 execvp .

の違いを知るには、まず exec* 関数は、ドキュメントを読む必要があります。
https://linux.die.net/man/3/exec
https://linux.die.net/man/2/execve

との違いは execl*execv* は引数渡しです。 execl* は引数のリストを要求するのに対し execv* は引数のベクトルを必要とします。
引数のリストは、コンパイル時にすべての引数を知っている場合に便利です。あなたの場合、引数はユーザが入力し、実行時に引数のベクトルを構築する必要があるので、いずれかの execv* 関数を使用します。

というサフィックスを持つ関数は p を使用します。 PATH 環境変数でプログラムを探します(例 "ls" を指定する必要があります (絶対パスかカレントディレクトリからの相対パス、たとえば "/bin/ls" ). 使用方法 PATH はシェルが通常行うことなので、これは正しい選択と思われます。

という接尾辞を持つ関数は e は、プロセスの環境を指定することができます。簡単のために、私はあなたのケースではこれを使用しません。

という結論に至ります。 execvp

もちろん system (代わりに fork / exec* / wait* ) のように、基本的なシェルを実装するのではなく、単にコマンドを解釈するためにシェルを使用することになります。