我正在尝试编写一个简单的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);
}
谢谢大家。
答案 0 :(得分:0)
查看现有免费软件shell的源代码(例如sash
或bash)并阅读Advanced Linux Programming
阅读execvp(3)手册页。请注意execvp
可能会失败。成功时,它不会返回!另外,stdout(3) 已缓冲,您需要致电fflush(3)。
您可能缺少一些基本的理解(shell是forking进程,也请阅读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),syscalls(2) ...
使用gcc -Wall -g
进行编译。了解如何使用调试器gdb
以及strace
BTW,真正的shell不使用strtok(3);他们明确地解析了这行(并且他们必须这样做,因为shell可以使用反斜杠或引号来转义空格。)
实际上,试试strace ls
;您会发现/bin/ls
使用stat(2)。