【发布时间】:2014-11-13 20:05:49
【问题描述】:
我正在制作一个小外壳以更好地理解 C。我使用 POSIX getline 函数来获取一个字符串并通过空格将其拆分为标记。但是当我调用 execvp() 进行系统调用时,什么也没有发生。如果有人指出我遇到的问题,显然我错过了一些可能很小的东西。(我没有包含整个代码所以底部会缺少一些大括号,请忽略这个抱歉)非常感谢
char *args[3]; // array for the command and arguments
cmd = strtok(line, " ");
args[0] = cmd; // put the first command in the array
for(int i = 1; i < whitespace+1; ++i){
cmd = strtok('\0', " \n");
args[i] = cmd; // fill the array of strings with the arguments
}
args[2] = '\0'; // assign last element to NULL
pid = fork();
if(pid != 0){
waitpid(-1, &stat, 0);
}
else{
char *const *test[1];
test[0] = '\0';
execvp("/bin/ls", test[0]);
execvp(args[0], &args[1]);
最后是我遇到问题的地方,我分别尝试了两个版本的 execvp,但都没有工作,我已经在这个问题上卡住了 2 天.. 任何帮助表示感谢,谢谢
【问题讨论】:
-
您的
args[2] = '\0';是一种设置空指针的非正统(但合法)方式。它还将您的命令限制为最多一个文件名。之前的循环变得有点多余。然后你有两个execvp()电话;如果第一个成功,则不会执行第二个。调用execvp()的正确方法是execvp(args[0], args);。execvp()之后应该有错误报告代码——如果返回,则失败——并且应该正常退出。 -
请注意,
getline()是 GNU 扩展,POSIX 未指定。不过,我只知道您正在使用它,因为它没有出现在您提供的代码中。 -
如何设置空指针比较正统。感谢您提供有关调用 execvp 的正确方法的提示。
-
请注意,当
execvp()工作时,它不会返回,因此很少适合连续调用两次。如果它确实返回,则说明发生了错误,您可以通过errno变量(可能通过perror()函数)获得有关该错误性质的句柄。 -
“如何设置空指针更正统的方式”?
args[2] = NULL;如果未定义NULL,则包括<stddef.h>