繁体   English   中英

使用execvp进行C编程

[英]c programming using execvp

我正在一个副项目上,我想生成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;
}

主要问题在于此行:

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()打印错误,如上所示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM