2016-10-27 42 views
0

對於項目,我必須能夠啓動多個程序的多個實例才能同時運行。爲此,我使用execle以便能夠在需要時傳遞一些參數。這裏是(大約)我的代碼: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的execle和weither my_envNULL與否third_program返回一個錯誤ADRESS。

當我將它們替換爲execl時,一切正常。

+1

的''...在你的代碼會導致編譯錯誤。因此,您不會向我們展示您正在使用的實際代碼。也許錯誤是你的真實代碼,而不是你在這裏發佈的代碼。 – nos

+0

我明顯沒有那些在我的實際代碼中。否則,即使execl也不行。 – systemasis

+1

問題在於你設置'my_env'的方式。你需要'char * my_env [2];'這樣你就有了一些指針。 –

回答

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); 
+0

對於2個指針的數組,動態分配沒有意義。 –

+0

@JonathanLeffler請不要告訴人們他們應該如何編寫代碼或者你認爲是否有意義。兩者都是有效的,兩者都是正確的,兩者都解決了他的問題,這取決於他決定走哪條路。你不知道這個應用程序,你不知道真正的代碼,你不知道它將運行的硬件,你對整個項目一無所知,你仍然敢於判斷哪個解決方案最好?去寫你自己的答案,你有機會這樣做,你沒有。 – Mecki