我正在尝试运行一段代码来执行一些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;
}
答案 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, " ");
}
这不是您的代码问题的确凿列表,正是我在快速阅读时发现的。