【问题标题】:c programming using execvp使用 execvp 进行 c 编程
【发布时间】:2017-12-06 09:19:31
【问题描述】:

我正在做一个附带项目,我想生成 5 个子进程,然后 execvp 进入第二个名为 isEven 的程序,它将判断传递给它的数字是否是偶数。但是,当我在 gdb 中运行它时,execvp 调用一直失败并且它没有执行。 args 和 load(args) 都在另一个函数中调用。

提前致谢!!!

//Code to load binary
void load(char* args[])
{
    execvp("./isEven", args);
    printf("ERROR\n");
} 

//args being passed in
char *args[] = {"./isEven", number, NULL};
load(args);

这是我编写的一个较小的程序,它与我现在正在尝试做的事情相同。 Gdb 说我遇到了分段错误。

int main(int argc, char *argv[])
{
    int returnCode = fork();

    if(returnCode == 0)
    {
        char *args[] = {"./isEven", 12345, NULL};
        execvp("./isEven", args);
        printf(errno);
        printf("ERROR: execvp failed\n");
        exit(-1);
    }
    else if(returnCode < 0)
    {
        fprintf(stderr, "fork failed\n");
    }
    else
    {
        //i am the parent
        printf("I am the parent");
    }
    return 1;
}

【问题讨论】:

  • number 是什么?程序的其余部分在哪里? (如果程序的其余部分太大了,把它变小,看看问题是否仍然存在。minimal reproducible example
  • execvp 如果失败则设置errno
  • 我写了一个快速程序来测试我是否可以让 execvp 工作,但是 gdb 给了我一个 seg 错误。

标签: c process system


【解决方案1】:

主要问题在于这一行:

char *args[] = {"./isEven", 12345, NULL};

传递给execvpargs 必须是char* 的数组。将12345 作为参数使其将其解释为地址,并且不太可能是有效地址。无论如何,这不是你想要通过的。这样做:

char *args[] = {"./isEven", "12345", NULL};

您需要将number 转换为字符串。例如:

int number = 12345;
char num_str[256];
snprintf(num_str, sizeof num_str, "%d", number);
char *args[] = {"./isEven", num_str, NULL};
execvp("./isEven", args);
perror("exec");

在您修改后的示例中,您将errno 打印为:

printf(errno);

这将失败,因为printf 需要一个字符串作为其第一个参数。您可以使用perror() 打印如上所示的错误。

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2015-05-30
    • 1970-01-01
    相关资源
    最近更新 更多