#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
void main(){
char *cmd;
pid_t pid;
while (1) {
printf("$ ");
fgets(cmd,1000,stdin);
if (pid = fork() == -1) {
exit(1);
}
else if (pid == 0){
execvp(cmd,&cmd);
}
else{
int status;
wait(&status);
}
}
}
我正在创建一个执行命令的简单shell,但是当我在提示符处输入命令时,我不断收到分段错误。这是最简单的版本,仅适用于单参数命令,如&#34; ls&#34;
答案 0 :(得分:2)
对于您的问题,在您的代码中
fgets(cmd,1000,stdin);
cmd
未初始化。它没有指向有效的内存。访问无效内存会调用undefined behavior。
在使用内存之前,您需要将内存分配给cmd
。或者,您可以考虑将cmd
作为数组,例如char cmd[1000] = {0};
,以避免需要自己分配内存。
然后,execvp(cmd,&cmd);
不太正确,它不是你想象的那样。请阅读man page以便更好地理解。
也就是说,对于托管环境,void main()
至少应该int main(void)
才能达到标准一致性。