あなたの問題は、それtemp
が単一のポインターであり、ポインターの配列をに渡す必要があることですexecvp()
。
何かのようなもの:
enum { MAX_ARGS = 64 };
char *args[MAX_ARGS];
char **next = args;
temp = strtok(line, " ");
while (temp != NULL)
{
*next++ = temp;
printf("%s\n", temp);
temp = strtok(NULL, " ");
}
*next = NULL;
execvp(args[0], args);
argv[argc] == NULL
のように、引数リストにはターミネータとして null ポインタが与えられていることに注意してくださいmain()
。明らかに、エラー チェックを怠っています (63 個を超える引数を渡すと、args
配列がオーバーフローすることになります)。しかし、これには核となる考えが含まれています。
この例では、単純なコマンドがls
機能しないようです。試してみたところmkdir
、echo
うまく機能しているようです。を渡すls
と、 から -1 が返されexecvp()
ます。
問題が何であるかはわかりません—これらはすべて私にとってはうまくいきます:
ls
ls -l
ls -l madump.c
(madump.c
たまたま、テストしているディレクトリ内のファイルです)
私が使用したコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
char line[1024];
while (fgets(line, sizeof(line), stdin) != NULL)
{
if (strcmp(line, "exit\n") == 0)
exit(EXIT_SUCCESS);
char *args[64];
char **next = args;
char *temp = strtok(line, " \n");
while (temp != NULL)
{
*next++ = temp;
printf("%s\n", temp);
temp = strtok(NULL, " \n");
}
*next = NULL;
puts("Checking:");
for (next = args; *next != 0; next++)
puts(*next);
execvp(args[0], args);
}
return EXIT_SUCCESS;
}
名前の最後に改行を含むディレクトリを作成した後、トークンリストに追加\n
したことに注意してください。strtok()
友人を困らせたり、半学歴の敵を困惑させるのには適していますが、他のほとんどの観点からは迷惑です. execvp()
実際に渡す直前に、渡されるデータをどのように出力するかに注意してください。多くの場合、引数の開始位置と終了位置を明確に示すために、printf("<<%s>>\n", *next);
代わりに を使用します。puts()
コマンドの実行による出力 ( doit
) は次のとおりです。
$ ./doit
ls -l madump.c
ls
-l
madump.c
Checking:
ls
-l
madump.c
-rw-r--r-- 1 jleffler staff 2352 Jul 28 2011 madump.c
$
あなたのバージョンから何を得ましたか?