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コマンドとそのさまざまな種類を使用する方法についていくつかのアドバイスを与えることができます。
この出力はあなたに手掛かりを与えません: 'Vlue of arg [1] ='? 'ls'に空文字列をパラメータとして指定しています。つまり、あなたは 'ls '''を実行しています。そのコマンドを手動で実行すると、同じ結果が表示されます。 2つの引数をハードコーディングするべきではありません。 – kaylum
2つの単語の引数を実行したい場合はどうすればいいですか?私はまた、いくつかの.cファイルを実行したい。だからこそ、2つの議論があります。 –
それはあなたがテストしているものではありません。 'ubos> ls'です。 'ls'コマンドの引数はありません。したがって、シェルはゼロ引数(1単語)を処理する必要があります。また、空の文字列( 'args [1] = arg2;')に盲目的に2番目のargを設定するだけでは、それを行うことはできません。 – kaylum