2016-10-12 14 views
-2
void main() { 
    char *args[MAX_LINE]; 
    char arg1[MAX_LINE/2] = "\0"; 
    char arg2[MAX_LINE/2] = "\0"; 
    printf("ubos>"); 
    fflush(stdout); 
    fgets(arg1, sizeof(arg1), stdin); 
    arg1[strlen(arg1) - 1] = '\0'; 
    fgets(arg2, sizeof(arg2), stdin); 
    arg2[strlen(arg2) - 1] = '\0'; 

    abc: 
    printf("You typed: %s %s\n", arg1, arg2); 
    fflush(stdin); 
    args[0] = arg1; 
    args[1] = arg2; 
    args[2] = '\0'; 

    int i = 0; 
    for (i = 0; i < MAX; i++) { 
     printf("Vlue of arg[%d] =%s\n", i, args[i]); 
    } 

    if (strcmp(args[0], "ls") == 0) { 
     execvp(args[0], args); 
     goto abc; 
    } else 
    if (strcmp(args[0], "ps") == 0) { 

    } 

    printf("Something is not correct...\n"); 
    exit(0); 
} 

lsコマンドでこのコードを実行すると、これが結果になります。私はこのコードで何が問題なのか分かりません。別の.cファイルを実行するためにこのコードを実行すると、それは完全に実行されますが、lsまたはpsコマンドを使用しようとすると、エラーがスローされます。lsコマンドはC言語(シェルスクリプト)で書かれたプログラムでは動作しません

なぜこのgotoがこのプログラムで動作しないのかという質問がもう1つあります。ので、ここで

ubos>ls 

You typed: ls 
Vlue of arg[0] =ls 
Vlue of arg[1] = 
Vlue of arg[2] =(null) 
ls: cannot access : No such file or directory 

は私のミスであり、あなたは私にのexecコマンドとそのさまざまな種類を使用する方法についていくつかのアドバイスを与えることができます。

+0

この出力はあなたに手掛かりを与えません: 'Vlue of arg [1] ='? 'ls'に空文字列をパラメータとして指定しています。つまり、あなたは 'ls '''を実行しています。そのコマンドを手動で実行すると、同じ結果が表示されます。 2つの引数をハードコーディングするべきではありません。 – kaylum

+0

2つの単語の引数を実行したい場合はどうすればいいですか?私はまた、いくつかの.cファイルを実行したい。だからこそ、2つの議論があります。 –

+0

それはあなたがテストしているものではありません。 'ubos> ls'です。 'ls'コマンドの引数はありません。したがって、シェルはゼロ引数(1単語)を処理する必要があります。また、空の文字列( 'args [1] = arg2;')に盲目的に2番目のargを設定するだけでは、それを行うことはできません。 – kaylum

答えて

0

引数を指定しない場合は、その引数をargsから0に設定します。 lsは、空の文字列を最初の引数として受け取らないので、引数を一切取得しません。

args[0] = arg1; 
if (strlen(arg2) == 0) { 
    args[1] = 0; 
} else { 
    args[1] = arg2; 
    args[2] = 0; 
} 

また、すべての引数を出力するループでこれをチェックする必要があります。

for(i=0;i<MAX && arg[i];i++) 
{ 
    printf("Value of arg[%d] =%s\n",i, args[i]); 
} 
+0

引数としてlsを入力すると、セグメンテーションが正しく表示されない –

+0

各引数の値を出力するループは、終了時に停止する必要があります。 – Barmar

+0

ありがとうございます。if(strlen(arg2)== '0') \t { \t \t args [0] = arg1; \t \t args [1] = '\ 0';他 \t} \t \t { \t \t引数[0] = ARG1。 \t \t args [1] = arg2; \t \t args [2] = 0; \t} –

-1
if (strlen(arg2) == '\0') 
    { 
     args[0] = arg1; 
     args[1] = '\0'; 
    } 
    else 
    { 
     args[0] = arg1; 
      args[1] = arg2; 
      args[2] = 0; 
    } 
for(i=0;i<MAX && args[i];i++) 
    { 
      printf("Vlue of args[%d] =%s\n",i, args[i]); 
    } 

私は2番目の引数として空白を渡しました。それは私にエラーを示していた。上のコードは私の問題の解決です。

関連する問題