EXECVPを使用してCでLSコマンドを書き込む方法
質問
私は簡単なLSコマンドを書いていますので、「LS R」を入力してください。コードがすべてのものであるかどうかを確認したいです。出力は何も表示しません。これはコードです:
int main(void){
char *line;
char *args[16];
pid_t pid;
line = (char*)malloc(1024);
printf("$ ");
fgets(line,1024,stdin);
args[0] = strtok(line, " ");
args[1] = strtok(NULL, " ");
printf("%s\n" , args[0]);
printf("%s", args[1]);
execvp(args[0], args);
}
.
すべてありがとう。
解決
既存のフリーソフトウェアシェルのソースコード(つまり、sash
または
execvp(3)マニュアルページ。 execvp
が失敗する可能性があることに注意してください。成功すると、は返されません!また、 stdout(3)は buffered 、あなたは fflush(3)を呼び出す必要があります。 / P>
おそらくいくつかの基本的な理解を欠いている(シェルは procession、 fork(2)& execve(2)など...)
最初の試してみてください:
int main(void){
char line[1024];
char *args[16];
memset (args, 0, sizeof(args));
printf("$ ");
fflush(NULL);
fgets(line,sizeof(line),stdin);
args[0] = strtok(line, " ");
args[1] = strtok(NULL, " ");
printf("%s\n" , args[0]);
printf("%s", args[1]);
fflush(NULL);
execvp(args[0], args);
perror("execvp");
return EXIT_FAILURE;
}
.
fflush(3)に必要な関連する#include
ディレクティブを忘れないでください。 、fgets
、execvp
、perror
。
読み取り errno(3)、
gcc -Wall -g
を使用してコンパイルします。 Debugger gdb
とstrace
BTW、実際のシェルは strtok(3);彼らは明示的に行を解析します(そしてシェルがバックスラッシュまたは見積もりでスペースを脱出することができるので)。
実際には、strace ls
を試してください。 /bin/ls
は、 stat(2)を使用することがわかります。
所属していません StackOverflow