在循环中调用时,execle返回一个错误的地址

时间:2016-10-27 13:31:20

标签: c linux

对于一个项目,我必须能够同时启动几个程序的多个实例。为此,我使用execle能够在需要时传递一些参数。这是(大致)我的代码:

char **my_env;

if(argc == 10){
    my_env[0] = malloc(20+sizeof(argv[9]));
    my_env[1] = NULL;
    snprintf(my_env[0], 20+sizeof(*argv[9]), "PREFIXE=%s", argv[9]);
}else{
    my_env[0] = NULL;
}

for(i=1; i <= n; i++){
    if((pid=fork()) == 0){
        execle(first_program, first_program, some_args, ..., (char *) 0, my_env);
        perror("Error at first_program's launch");
        exit(1);
    }else{
        if((pid = fork()) == 0){
            execl(second_program, second_program, some_args, ..., (char *) NULL, my_env);
            perror("Error at second_program's launch");
            exit(1);
        }
    }
}

execle(third_program, third_program, some_args, ..., (char *) NULL, my_env);
perror("Error at third_program's launch");
exit(1);

我的问题是当n大于1时,second_program和third_program的execle会返回错误的地址my_envNULL

当我用execl替换它们时,一切正常。

1 个答案:

答案 0 :(得分:1)

您永远不会为my_env初始化内存。你告诉编译器

char **my_env;

这意味着my_env*指针数组的指针char *。好的......但是直接在声明之后,my_env有一个随机值,所以它是一个指向随机存储器的指针。它指向的数组在哪里?你还没有创建这样的数组,你只是声明了一个指针。

然后你可以使用my_env,就像这样

my_env[0] = ...;

这意味着“将值...写入数组my_env的第一个条目”指向“...再次,什么数组?您的my_env未指向任何阵列!

您必须为my_env提供静态内存:

char * my_env[2] = { NULL, NULL };

或动态:

char ** my_env = calloc(sizeof(char *), 2);
// ... and when you are done with it ...
free(my_env);