C++ 尝试分叉一个进程时,第一个命令起作用,但第二个命令总是给出一个错误
因此,目前我正在创建一个shell接口,它接受用户命令,然后在单独的进程中执行每个命令。我花了一点时间才将输入正确地输入到字符数组中。(必须对其进行解析并划分每个输入,即args[0]=ls,args[1]=l)。我很确定我做得对,但我想这就是我的问题所在。 因此,在解析输入之后,我创建一个子进程,使用execvp系统调用执行参数。在我的父进程中,我有一个条件语句,如果命令的最后一部分有一个符号,它将调用Wait()函数。 所以我面临的问题是,当我执行这段代码时,我能够正确地执行第一个命令,但是无论第二个命令是什么,我都会得到一个错误。我认为这与事后没有清除阵列有关,但很难缩小此问题的范围。任何帮助都将不胜感激C++ 尝试分叉一个进程时,第一个命令起作用,但第二个命令总是给出一个错误,c++,shell,unix,process,fork,C++,Shell,Unix,Process,Fork,因此,目前我正在创建一个shell接口,它接受用户命令,然后在单独的进程中执行每个命令。我花了一点时间才将输入正确地输入到字符数组中。(必须对其进行解析并划分每个输入,即args[0]=ls,args[1]=l)。我很确定我做得对,但我想这就是我的问题所在。 因此,在解析输入之后,我创建一个子进程,使用execvp系统调用执行参数。在我的父进程中,我有一个条件语句,如果命令的最后一部分有一个符号,它将调用Wait()函数。 所以我面临的问题是,当我执行这段代码时,我能够正确地执行第一个命令,但是
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <cstring>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
#define MAX_LINE 80 //the maximum length command
using namespace std;
int main()
{
char* args[MAX_LINE/2 + 1]; //command line arguments
char str[41]; //intitialize string for input
int should_run = 1; //flag to determine when to exit program
int index = 0;
pid_t pid; //process id
while (should_run) {
cout << "prompt> ";
fflush(stdout);
cin.getline(str, 41);
args[index] = strtok(str, " ");
while (args[index] != NULL) {
// test cout << args[index] << endl;
index++;
args[index] = strtok(NULL, " ");
}
args[index + 1] = NULL;
if (strcmp (args[0], "exit") == 0) //in input is "exit", exit the while loop
break;
// (1) fork a child process using fork()
pid = fork();
if (pid < 0) { //error handling
perror("Fork Failed.");
break;
}
// (2) the child process will invoke execvp()
if (pid == 0) {
//child process
cout << "child:" << pid << endl;
execvp (args[0], args);
}
// (3) if command didn't included &, parent will invoke wait()
//parent process
if (pid > 0)
{
// parent process
if (strcmp (args[index], "&") == 0) {
wait(0);
cout << "parent: " << pid << endl;
}
}
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAX_LINE 80//最大长度命令
使用名称空间std;
int main()
{
char*args[MAX_-LINE/2+1];//命令行参数
char str[41];//初始化输入字符串
int应该\u run=1;//确定何时退出程序的标志
int指数=0;
pid\u t pid;//进程id
while(应该运行){
在解析第二个和后续命令时,您是否忘记将索引重新初始化为0。错误是非常明显的。我确信,一旦您使用调试器一次一行地逐行检查代码,检查所有变量的值,您将能够自己找出错误。知道如何使用调试器是每个C++开发者必备的技能。自由提示:在第二次循环中使用调试器显示 index <代码>的值。@ SamVarshavchik,你有没有机会推荐一个?我还没有学会如何正确地使用一个。现在是一个好的开始时间。在Linux和UNIX上,<代码> GDB < /代码>统治了。请注意,只有一个调试器。@SamVarshavchik我的索引应该在while循环中初始化,嗯?差不多。