Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c shell中使用execvp分割错误 #包括 #包括 #包括 #包括 #包括 #包括 void main(){ char*cmd; pid_t pid; 而(1){ printf($); fgets(cmd,1000,stdin); 如果(pid=fork()==-1){ 出口(1); } 否则如果(pid==0){ 执行副总裁(命令和命令); } 否则{ 智力状态; 等待(&状态); } } }_C_Shell_Exec_Fgets - Fatal编程技术网

在c shell中使用execvp分割错误 #包括 #包括 #包括 #包括 #包括 #包括 void main(){ char*cmd; pid_t pid; 而(1){ printf($); fgets(cmd,1000,stdin); 如果(pid=fork()==-1){ 出口(1); } 否则如果(pid==0){ 执行副总裁(命令和命令); } 否则{ 智力状态; 等待(&状态); } } }

在c shell中使用execvp分割错误 #包括 #包括 #包括 #包括 #包括 #包括 void main(){ char*cmd; pid_t pid; 而(1){ printf($); fgets(cmd,1000,stdin); 如果(pid=fork()==-1){ 出口(1); } 否则如果(pid==0){ 执行副总裁(命令和命令); } 否则{ 智力状态; 等待(&状态); } } },c,shell,exec,fgets,C,Shell,Exec,Fgets,我正在制作一个简单的shell来执行命令,但是当我在提示符下输入命令时,我总是遇到分段错误。这是最简单的版本,只适用于单参数命令,如“ls”,用于解决您的问题,在您的代码中 #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> #include <string.h> v

我正在制作一个简单的shell来执行命令,但是当我在提示符下输入命令时,我总是遇到分段错误。这是最简单的版本,只适用于单参数命令,如“ls”

,用于解决您的问题,在您的代码中

#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);
}
}
}
cmd
未初始化。它没有指向有效内存。访问无效内存调用

您需要将内存分配给
cmd
,然后才能使用它。或者,您可以考虑制作<代码> CMD < /Cord>数组,如<代码> char CMD(1000)={ 0 };<代码>以避免需要自己分配内存

然后,
execvp(cmd,&cmd)不太正确,它不是您认为的那样。为了更好地理解,请阅读


这就是说,对于托管环境,
void main()
至少应该是
int main(void)
,以具有标准一致性。

但是我有
char*cmd如果我看到这个,它初始化指针right@JimmySamoladas好的,它定义了
cmd
,没有初始化它,更不用说是一个有效的数组了。我以前尝试过char数组,但是我得到了关于execvp参数的错误,该参数要求
const char*
,我给出了
const char*[1000]
@JimmySamoladas我不知道;I don’我不认为你正确使用了
execvp()
,请阅读我答案中链接的手册页。这正是让我困惑的地方。我希望它运行时没有参数,只有命令名,因此我不知道在
execvp
的第二个参数中放置什么,我尝试了强制转换(const char*)NULL,但这似乎不正确欢迎使用堆栈溢出!听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:。是什么让你决定最多读取
1000
char
s?这个
pid=fork()==-1
并不像你想象的那样(详情请参见此处:)。1000个最大值部分是实验性的。当程序正常运行时,我将以更通用的方式工作
 fgets(cmd,1000,stdin);