【问题标题】:execvp system call problemsexecvp系统调用问题
【发布时间】: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,则包括 &lt;stddef.h&gt;

标签: c posix execvp


【解决方案1】:

这是一个如何使execvp 工作的最小示例。

#include <stdio.h>
#include <unistd.h>

int main( void )
{
    char *test[2];              // declare an array of pointers
    test[0] = "/bin/ls";        // first arg is the path to the executable
    test[1] = NULL;             // NULL terminator indicates no additional args
    execvp( test[0], test );
}

这是来自execvp 手册页的解释

按照惯例,第一个参数应该指向文件名 与正在执行的文件相关联。指针数组必须 由 NULL 指针终止。

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2021-07-24
    • 2021-11-05
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多