2016-10-27 2 views
0

프로젝트의 경우, 동시에 실행할 수있는 두 개의 프로그램 인스턴스를 여러 개 실행할 수 있어야합니다. 이렇게하려면 필요한 경우 일부 매개 변수를 전달할 수 있도록 execle을 사용합니다. 여기 (약) 내 코드 : n는 second_program에 대한 execle 1보다 큰 및 my_envNULL 여부입니다 weither third_program 나쁜 ADRESS을 반환 할 때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); 

내 문제입니다.

execl으로 교체하면 모든 것이 정상적으로 작동합니다.

+1

은'...'코드에서 컴파일러 오류가 발생합니다. 따라서 사용중인 실제 코드를 표시하지 않습니다. 아마도이 오류는 여기에 게시 한 코드가 아닌 실제 코드입니다. – nos

+0

분명히 실제 코드에는 포함되어 있지 않습니다. 그렇지 않으면 execl조차도 작동하지 않습니다. – systemasis

+1

문제는 당신이'my_env'를 설정하는 방법에 있습니다. 'char * my_env [2]; '가 필요하다. 그래서 포인터를 얻을 수있다. –

답변

1

my_env의 메모리는 초기화하지 않습니다. 당신은 컴파일러 my_envchar * 포인터의 배열에 대한 포인터 * 의미

char **my_env; 

에게 말해. 좋아요.하지만 선언 바로 다음에 my_env은 임의의 값을 가지므로 임의의 메모리에 대한 포인터입니다. 배열이 가리키는 곳은 어디입니까? 아직 배열을 만들지 않았습니다. 방금 포인터를 하나의 포인터로 선언했습니다. 그런 다음 단지 중이 뜻이

my_env[0] = ...; 

처럼 my_env를 사용

... 다시, 어떤 배열 "값 ... 배열 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); 
+0

2 포인터의 배열의 경우 동적 할당에 아무런 포인트가 없습니다. –

+0

@JonathanLeffler 코드를 작성하는 방법이나 의미있는 것으로 간주되는 것을 사람들에게 말하지 마십시오. 둘 다 유효합니다, 둘 다 맞고, 둘 다 그의 문제를 해결합니다. 어느쪽으로 갈 것인지 결정하는 것은 그에게 달려 있습니다. 응용 프로그램을 모르거나 실제 코드를 모르거나 실행할 하드웨어를 모르고 전체 프로젝트에 대해 알지 못하고 어떤 솔루션이 가장 좋을지 판단 할 수 있습니까? 자신의 대답을 쓰십시오. 그렇게 할 기회가 있었지만하지 않았습니다. – Mecki

관련 문제