0

我正在尝试运行一段将执行一些 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;

}

4

1 回答 1

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, " ");
}

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

于 2013-04-27T12:14:21.863 回答