c - 在 c shell 中使用 execvp 出现段错误

标签 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,但是当我在提示符下输入命令时,我不断收到段错误。这是最简单的版本,仅适用于像“ls”这样的单参数命令

最佳答案

对于您的代码中的问题

 fgets(cmd,1000,stdin);

cmd 未初始化。它不指向有效的内存。访问无效内存调用 undefined behavior .

您需要先为 cmd 分配内存,然后才能使用它。或者,您可以考虑将 cmd 设为数组,例如 char cmd[1000] = {0}; 以避免需要自己分配内存。

那么,execvp(cmd,&cmd);不太对,不是你想的那样。阅读man page为了更好的理解。

也就是说,对于托管环境,void main() 至少应为 int main(void) 才能符合标准。

关于c - 在 c shell 中使用 execvp 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40330330/

相关文章:

C 编程 - 字符数组与字符串数组寻址消歧

c - Linux中STREAMS的魔力。什么时候结束?

c - 如何为该程序正确格式化输出?

shell - SSH - 一种无需打开单独的 SFTP session 即可传输文件的方法?

database - 通过命令行插入 SQL 语句而无需重新打开与远程数据库的连接

c - 无法确定此汇编代码中的常量

linux - 在 Linux 中查找文件然后 cd 到该目录

python exec 没有 kwargs

python - 我怎样才能清理 exec 的使用,无法让 setattr 来完成这项工作?

go - 如何从 exec 命令获取错误消息