質問

私は簡単な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または bash ) 詳細Linuxプログラミング

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ディレクティブを忘れないでください。 fgetsexecvpperror

読み取り errno(3) syscalls(2) ...

gcc -Wall -gを使用してコンパイルします。 Debugger gdbstrace

の使用方法を学びます。

BTW、実際のシェルは strtok(3);彼らは明示的に行を解析します(そしてシェルがバックスラッシュまたは見積もりでスペースを脱出することができるので)。

実際には、strace lsを試してください。 /bin/lsは、 stat(2)を使用することがわかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top