execvp-won';不要执行命令
我试图运行一段代码,它将执行一些UNIX命令,这些命令存储在数组lineArray中,例如: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
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
”中。