我正在为我的学校编写一个非常基本的 shell。当我尝试时,即使像“pwd”或“date”这样的命令也有效“ls”它告诉我 “ls:没有这样的文件或目录错误”
我的外壳代码如下:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int i;
char *line=(char *) malloc(1024*sizeof(char));
while (1) {
/* Print the command prompt */
printf("$ ");
fflush(stdout); /* Anagazei na trexei thn printf
/* Read a command line */
fgets(line, 1024, stdin);
for(i=0;i<1024;i++){
if(line[i]=='\n')
{
line[i]='\0';
}
}
//printf("%s", line);
pid_t pid = fork(); /* Dhmiourgei paidi. antigrafo diergasias. */
if (pid==0){
execlp(line,line);
}
else waitpid(pid,0,0);
}
}
答案1
请仔细阅读 execlp 的手册页:
参数列表必须以 NULL 指针终止,并且由于这些是可变参数函数,因此该指针必须强制转换 (char *) NULL。
使用这条线对我有用:
execlp(line,line, (char*) NULL);
您的代码还针对这一行给出了警告(使用 GCC):
a.c: In function ‘main’:
a.c:26:12: warning: not enough variable arguments to fit a sentinel [-Wformat=]
execlp(line,line);
^