[英]how to write ls command in c using execvp
我正在尝试编写一个简单的 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)已缓冲,您需要调用fflush(3) 。
您可能缺少一些基本的理解(shell 正在分叉进程,另请阅读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) 、 fgets
、 execvp
、 perror
所需的相关#include
指令。
另请阅读errno(3) , syscalls(2) ...
使用gcc -Wall -g
编译。 了解如何使用调试器gdb
和strace
顺便说一句,真正的 shell 不使用strtok(3) ; 他们显式地解析该行(并且必须这样做,因为 shell 可以使用反斜杠或引号转义空格)。
实际上,试试strace ls
; 你会发现/bin/ls
使用stat(2) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.