execvp-won';不要执行命令

execvp-won';不要执行命令,c,execvp,C,Execvp,我试图运行一段代码,它将执行一些UNIX命令,这些命令存储在数组lineArray中,例如:lineArray={“ls-l”,“ls”,“pwd”,NULL} 问题是,尽管我在调试时看到我的函数根据execvp MAN正确地解析了命令及其参数,但这段代码将只打印出数组中的第一个命令 任何形式的帮助都将不胜感激 int startProcesses(int background) { int i = 0; int j = 0; int pid; int status; char *copyPro

我试图运行一段代码,它将执行一些UNIX命令,这些命令存储在数组lineArray中,例如:
lineArray={“ls-l”,“ls”,“pwd”,NULL}

问题是,尽管我在调试时看到我的函数根据execvp MAN正确地解析了命令及其参数,但这段代码将只打印出数组中的第一个命令

任何形式的帮助都将不胜感激

int startProcesses(int background) {
int i = 0;
int j = 0;
int pid;
int status;
char *copyProcessName[256];
int len, var=0;

while(lineArray[i] != NULL) {

    while(*(copyProcessName+var) != NULL) {
        copyProcessName[var] = NULL;
    }

    j=0;
    copyProcessName[j] = strtok(lineArray[i], " ");
    while (copyProcessName[j] != NULL){
        j++;
        copyProcessName[j] = strtok(NULL, " ");
    }


    pid = fork();

    if (pid == 0) {
        // Child Process
        execvp(copyProcessName[0], copyProcessName);
        fflush(stdout);
        i++;
        continue;

    } else if (!background) {
        // Parent Process
        waitpid(pid, &status, 0);
        i++;
        if(WEXITSTATUS(status)) {
            printf(CANNOT_RUN_ERROR);
            return 1;
        }
    } else {
        i++;
        continue;
    }
}
return 0;

}

此代码显然不正确:

len = strlen(copyProcessName);
for (var = 0; var < len; ++var) {
    copyProcessName[var] = NULL;
}
有什么问题吗

while(lineArray[i] != NULL)
它较短,而且是一个数组,因此您可能希望使用
[]
对其进行索引

您还应该检查
execvp(…)
的返回值-如果返回,您将希望打印返回值,因为这将表明您可能做错了什么

在外循环的第二次迭代中,当您看到下面的代码时,
j
不是零,这可能会导致各种各样的问题:

copyProcessName[j] = strtok(lineArray[i], " ");
while (copyProcessName[j] != NULL){
    j++;
    copyProcessName[j] = strtok(NULL, " ");
}

这不是您的代码问题的结论性列表,只是我在快速阅读时发现的问题。

此代码显然不正确:

len = strlen(copyProcessName);
for (var = 0; var < len; ++var) {
    copyProcessName[var] = NULL;
}
有什么问题吗

while(lineArray[i] != NULL)
它较短,而且是一个数组,因此您可能希望使用
[]
对其进行索引

您还应该检查
execvp(…)
的返回值-如果返回,您将希望打印返回值,因为这将表明您可能做错了什么

在外循环的第二次迭代中,当您看到下面的代码时,
j
不是零,这可能会导致各种各样的问题:

copyProcessName[j] = strtok(lineArray[i], " ");
while (copyProcessName[j] != NULL){
    j++;
    copyProcessName[j] = strtok(NULL, " ");
}

这并不是您的代码问题的结论性列表,只是我在快速阅读时发现的问题。

len=strlen(copyProcessName),你的想法是什么
copyProcessName
是一个
char*[256]
,因此它被转换为
char**
作为
strlen
的参数。你的编译器没有对此抱怨吗?另外,如果
execvp
返回,则子进程应该死亡,而不是
继续
len=strlen(copyProcessName),你的想法是什么
copyProcessName
是一个
char*[256]
,因此它被转换为
char**
作为
strlen
的参数。你的编译器没有对此抱怨吗?另外,如果
execvp
返回,那么孩子应该死亡,而不是
继续
。啊,但是
*(数组名称+索引)
的灵活性太大了。请您详细解释一下execvp的返回值是什么意思?阅读手册页。它会说类似“如果有错误,返回值是-1,错误原因存储在
errno
”。啊,但是
*(array\u name+index)
太小了。你能详细解释一下execvp的返回值是什么意思吗?阅读手册页。它会说“如果有错误,返回值为-1,错误原因存储在
errno
”中。