2016-10-27 4 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より大きい場合my_envNULLかではありませんweither、second_programとthird_programためexecleが悪いアドレスを返します。

私がexeclに置き換えたとき、すべて正常に機能します。

+1

'...'あなたのコード内でコンパイルエラーが発生します。したがって、使用している実際のコードは表示されません。おそらくあなたの本当のコードはあなたがここに投稿したものではありません。 – nos

+0

私は明らかにそれらを私の実際のコードに持っていません。さもなければ、execlでも動作しません。 – systemasis

+1

問題はあなたが 'my_env'を設定しているところにあります。 'char * my_env [2];'が必要なので、いくつかのポインタがあります。 –

答えて

1

my_envのメモリは決して初期化されません。あなたは、コンパイラmy_envchar *ポインタの配列へのポインタ*であることを意味し

char **my_env; 

に伝えます。 OK ...しかし、その宣言の直後には、my_envにランダムな値があるので、ランダムなメモリへのポインタです。その配列はどこにポイントしていますか?あなたはまだそのような配列を作成していない、あなたは1つのポインタを宣言しました。

それからちょうどこれは...もう一度、何のアレイ「に配列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

関連する問題