对于一个项目,我必须能够同时启动几个程序的多个实例。为此,我使用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_env
是NULL
。
当我用execl
替换它们时,一切正常。
答案 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);