我试图创建ls命令。首先,如果我输入" ls"则代码不起作用,它仅在我输入完整路径时起作用。其次,它在exevcp()之后没有循环。为什么? 谢谢。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(void){
char *line;
char *args[32];
memset(args, 0, sizeof(args));
while (1){
line = (char*)malloc(1024);
printf("$ ");
fgets(line,1024,stdin);
args[0] = strtok(line, " ");
args[1] = strtok(NULL, " ");
execvp(args[0], args);
perror("execvp");
}
}
答案 0 :(得分:2)
它不循环,因为execve()
永远不会返回。此外,这似乎是一种非常奇怪的实现ls
的方法:你应该尝试打开一个目录并读取其内容(文件列表),而不是运行另一个命令,我希望。
答案 1 :(得分:1)
它不是循环因为(引用man page):
exec
系列函数用新的过程映像替换当前过程映像。
换句话说,execvp()
仅在出现错误时才会返回。
虽然我们正在讨论这个主题,但您可能需要阅读fork-exec。
我不确定路径问题; execvp()
当然应该搜索$PATH
(并且当我在计算机上测试您的代码时,ls
和/bin/ls
同样有效。)
要记住的一件事是,fgets()
会返回终止换行符,该换行符最终会出现在args
数组中。例如,如果您输入没有参数的ls
并按Enter键,则args[0]
将设置为ls\n
',execvp()
将失败。
哦,你有一个内存泄漏,因为你永远不会释放line
。
答案 2 :(得分:0)
以下是使用ls
实现c
命令的简单方法。要运行使用,例如./xls /tmp
#include<stdio.h>
#include <dirent.h>
void main(int argc,char *argv[])
{
DIR *dir;
struct dirent *dent;
dir = opendir(argv[1]);
if(dir!=NULL)
{
while((dent=readdir(dir))!=NULL)
{
if((strcmp(dent->d_name,".")==0 || strcmp(dent->d_name,"..")==0 || (*dent->d_name) == '.' ))
{
}
else
{
printf(dent->d_name);
printf("\n");
}
}
}
close(dir);
}