我必须编写自己的 shell,它几乎已完成,但我在 ls/pwd 方面遇到问题
ls 给我这个错误:无法访问'':没有这样的文件或目录
pwd 正在以某种方式工作,但它仍然给我错误:忽略非选项参数
/image/3IpRd.png 可能是什么问题?
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
void parsowanie(char *line, char **argv)
{
while (*line != '\0') {
while (*line == ' ' || *line == '\n'|| *line == '\t' )
*line++ = '\0';
*argv++ = line;
while (*line != '\0' && *line!= ' ' && *line != '\t' && *line != '\n')
line++;
}
*argv = '\0';
}
int main()
{
printf("MicroShell\nAutor:Amadeusz Lewandowski\n");
char co_chcesz[500],cwd[500],login[50],*argv[1000],*to;
memset(argv,0,999);
pid_t pid;
int status;
while(strcmp(co_chcesz,"exit\n"))
{
sleep(1);
getcwd(cwd,sizeof(cwd));
getlogin_r(login,sizeof(login));
printf("[%s:%s]\n$ ",login,cwd);
fgets(co_chcesz,1000,stdin);
if (strcmp(co_chcesz,"help\n")==0)
{
printf("autor to miranda orange\n");
continue;
}
pid=fork();
if(pid==0)
{
if (execvp(*argv,argv)<0)
{
perror("The following error occurred");
printf("Value of errno:%d\n",errno);
break;
}
else
{
waitpid(pid,&status,0);
}
}
}
return 0;
}
最佳答案
你的命令行分割函数是错误的。此处重新格式化以更好地展示其实现方式:
void parsowanie(char *line, char **argv)
{
while (*line != '\0') {
/* Eating whitespace */
while (*line == ' ' || *line == '\n'|| *line == '\t' )
*line++ = '\0';
/* Adding next command line argument to `argv` */
*argv++ = line;
while (*line != '\0' && *line!= ' ' && *line != '\t' && *line != '\n')
line++;
}
*argv = '\0';
}
问题是您将下一个命令行参数添加到 argv
在您真正知道是否有下一个命令行参数之前。所以我们要在*argv++ = line;
之前添加一个测试。测试在while
现在声明变得不必要了。
void parsowanie(char *line, char **argv)
{
while (1) {
/* Eating whitespace */
while (*line == ' ' || *line == '\n'|| *line == '\t' )
*line++ = '\0';
/* Checking if there are more command line arguments */
if (!*line)
{
/* Terminating `argv` */
*argv = NULL;
return;
}
/* Adding next command line argument to `argv` */
*argv++ = line;
while (*line != '\0' && *line!= ' ' && *line != '\t' && *line != '\n')
line++;
}
}
关于c - 可能出了什么问题, ls 在我自己的 shell 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59804553/