2013-04-27 173 views
0

我试图运行一段代码将执行几个UNIX命令,这些命令存储在所述阵列lineArray其例如:lineArray = {"ls -l", "ls", "pwd", NULL};execvp将不执行命令

问题是此代码只会打印出数组中的第一个命令,即使我已经在调试中看到我的函数根据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

'len = strlen(copyProcessName);',有什么想法? 'copyProcessName'是一个'char * [256]',所以它被转换为'char **'作为'strlen'的参数。你的编译器没有抱怨过吗?另外,如果'execvp'返回,孩子应该死亡,而不是'继续'。 – 2013-04-27 12:07:57

回答

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

这是不是有问题的确凿名单你的代码,就是我在相当快速地阅读时发现的。

+1

啊,但是'*(array_name + index)'是非常吝啬的。 – 2013-04-27 12:23:04

+0

你能否详细解释一下你的意思是关于execvp的返回值? – Steinfeld 2013-04-27 12:25:56

+0

阅读手册页。它会说“如果有错误,返回值是-1,错误的原因存储在'errno'”中。 – 2013-04-27 12:33:15