使用c shell中的execvp进行分段错误

时间:2016-10-30 14:52:59

标签: c shell exec fgets

#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;

1 个答案:

答案 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)才能达到标准一致性。