execle()函数中的errno错误地址错误

时间:2017-01-02 22:41:08

标签: c

我的目标是学习如何执行execle()函数。我在Head First C书中找到了这段代码。

这是主程序代码(diner_info.c):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

        printf("Diners: %s\n", argv[1]);
        printf("Juice: %s\n", getenv("JUICE"));
        return 0;
}

这包含execle()函数(my_exec_program.c):

#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

        char *my_env[] = {"JUICE=peach and apple", NULL};

int main()
{

        execle("diner_info", "diner_info", 4, NULL, my_env);
        puts(strerror(errno));

        return 0;
}

当我编译所有c文件时,我没有收到错误。但是当我运行编译文件(my_exec_program)时,我从my_exec_program得到了这个结果:

Bad address

有人帮助我如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

4被视为指向char的指针。如果要将{4}作为argv参数传递,则需要为字符串:"4"

答案 1 :(得分:1)

更改此

    execle("diner_info", "diner_info", 4, NULL, my_env);

为:

execle("diner_info", "diner_info", "4", (char*)0, my_env);

您希望传递字符串作为参数,而int值4则视为地址。 execle()所采用的参数的可变数量是所有C字符串,由空指针终止。

注意:使用NULL时请注意,如果NULL定义为#define NULL 0,那么exec*()可变参数函数将无法正常工作。 相反,为了安全,我会使用(char*)0代替NULL