2016-12-28 5 views
0

私はexecveコマンドに少し問題があります。プログラムTestは2つの子を作成し、それぞれがexecveを実行して別のプログラムをロードして実行する必要があります。しかし、私は両方のexecveに悪いアドレスを取得しています。次のようにコードは次のとおりです。Execveが悪いアドレスを与えています

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <errno.h> 
#include <time.h> 
#include <sys/ipc.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(){ 
    int child_1, child_2; 

    child_1=fork(); 
    if(child_1==0){ 
     char* argv[]={"Test", "Test_1", "NULL"}; 
     if((execve("Test_1", argv, NULL))<0) perror("execve 1 fail"); 
     exit(0); 
    }else if(child_1<0)perror("error fork"); 
    else wait(NULL); 

    child_2=fork(); 
    if(child_2==0){ 
     char* argv1[]={"Test", "Test_2", "NULL"}; 
     if((execve("Test_2", argv1, NULL))<0) perror("execve 2 fail"); 
     exit(0); 
    }else if(child_2<0)perror("error fork"); 
    else wait(NULL); 
return 0; 
} 
+0

エラーは*それ自体では発生しませんが、第2子をフォークする前に最初の子を待っていることは疑いありません。 2人の子供が逐次実行されることを意図している場合、それはそれを行う方法に過ぎませんが、同時に実行するつもりなら、両方の子供をフォークした後まで待つべきではありません。 –

+0

チップをありがとう。それは同時に動作するはずですので、私はあなたが提案したものを試してみます。 – Leo

答えて

4

あなたは正しく引数配列を終了されていません。

char* argv[]={"Test", "Test_1", "NULL"}; 

"NULL"それはNULLと同じではありませんが、文字列リテラルです。配列はNULLポインタで終了する必要があります。代わりに次のようにします。

char* argv[]={"Test", "Test_1", (char*)0}; 

同様に、他の引数配列を固定します。

+0

クイック返信をありがとう、今すぐ動作します。 – Leo

+0

あなたは大歓迎です! –

関連する問題