0
  1. UbuntuのCで簡単なシェルを作成しようとしています。exevcp()関数を使うことを考えました。「ls」コマンドしか実行できません。他のコマンドはどれも機能していないようです。誰かがなぜそれが起こっているのか教えてもらえますか、それともシェルを構築するためのより良い方法のアイデアを教えてもらえますか?

  2. 私の目的は、このシェルを構築することです。execvp()コマンドラインをそのまま関数に入れられない理由がわかりません。

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    #include <string.h>
    #include <errno.h>
    
    int main(int argc,char **argv,char **envp)
    {
        char* args[] = {"history" , NULL};
    
        execvp(args[0],args);
    }
    

説明してもらえますか?

4

2 に答える 2

3

exec(3)外部プログラムの実行にのみ使用できます。historyほとんどのシェルに組み込まれており、この方法では実行できません。

于 2012-11-22T21:47:01.380 に答える
1

システム コールには 2 つの引数があります。execvp()実行するプログラムの名前と、コマンドの引数である文字列のヌル終了リストへのポインタです。

例えば:

char *args[] = { "ls", "-l", "-t", "-r", ".", 0 };
execvp(args[0], args);
...report error...

execvp()単純に文字列全体を渡して、それが分割されることを期待することはできません。呼び出しコードはそれを行う必要があります。への最初の引数が指す文字列execvp()にスラッシュが含まれている場合、この$PATHメカニズムはコマンドの検索に使用されないことに注意してください。プレーン ネーム (図のように"ls") は、 を使用して検索され$PATHます。

historyまた、やなどの一部のコマンドcdはシェルの組み込みであることも覚えておく必要があります。同じ効果を得るために実行できる外部実行可能ファイルはありません。それらを実行することはできません。test(aka )などの他のコマンドは、[通常、組み込みとして実装されますが、通常、または (多かれ少なかれ) 同じジョブを実行するバイナリも存在/binする/usr/binため、これを呼び出すことができます。

于 2012-11-22T22:11:24.850 に答える