execvp不会执行命令

时间:2013-04-27 12:02:47

标签: 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 *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;

}

1 个答案:

答案 0 :(得分:3)

这段代码显然不对:

len = strlen(copyProcessName);
for (var = 0; var < len; ++var) {
    copyProcessName[var] = NULL;
}

鉴于如果len可能为零,我们不知道copyProcessName的内容实际上包含了什么。

while(*(lineArray+i) != NULL)

出了什么问题:

while(lineArray[i] != NULL)

它更短,而且它是一个数组,因此您可能希望使用[]对其进行索引。

您还应该检查execvp(..)的返回值 - 如果它返回,您将要打印返回值的内容,因为这将表明您可能做错了什么。

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

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

这不是您的代码问题的确凿列表,正是我在快速阅读时发现的。