2017-12-06 74 views
0

私は5つの子プロセスを生成し、次にexecvpをisEvenという2番目のプログラムに生成し、渡された数値が偶数であるかどうかを確認するサイドプロジェクトに取り組んでいます。しかし、execvp呼び出しはgdbで実行しても失敗し続け、実行されません。 argsとload(args)はどちらも別の関数で呼び出されます。c execvpを使ったプログラミング

ありがとうございます!!!

//Code to load binary 
void load(char* args[]) 
{ 
    execvp("./isEven", args); 
    printf("ERROR\n"); 
} 

//args being passed in 
char *args[] = {"./isEven", number, NULL}; 
load(args); 

私が書いたより小さいプログラムは、私が今やっていることと同じことをしています。 Gdbは私がセグメンテーション違反を得ていると言います。

int main(int argc, char *argv[]) 
{ 
    int returnCode = fork(); 

    if(returnCode == 0) 
    { 
     char *args[] = {"./isEven", 12345, NULL}; 
     execvp("./isEven", args); 
     printf(errno); 
     printf("ERROR: execvp failed\n"); 
     exit(-1); 
    } 
    else if(returnCode < 0) 
    { 
     fprintf(stderr, "fork failed\n"); 
    } 
    else 
    { 
     //i am the parent 
     printf("I am the parent"); 
    } 
    return 1; 
} 
+1

「数値」とは何ですか?残りのプログラムはどこですか? (プログラムの残りの部分が大きすぎる場合は、それを小さくして問題がまだ起きているかどうかを確認してください) – Ryan

+1

execvpは、失敗した場合に 'errno'を設定します。 – tkausl

+0

私はexecvpを動作させることができるかどうかをテストするための簡単なプログラムを書いたが、gdbは私にseg faultを与えている。 – Steven

答えて

2

主な問題は、この行である:

char *args[] = {"./isEven", 12345, NULL}; 

argschar*の配列でなければならないexecvpに渡されます。引数として12345を付けると、アドレスとして解釈され、有効なアドレスである可能性は低いです。いずれにせよ、それはあなたが渡したかったものではありません。したがって:

char *args[] = {"./isEven", "12345", NULL}; 

numberを文字列に変換する必要があります。例えば:あなたの変形例では

int number = 12345; 
char num_str[256]; 
snprintf(num_str, sizeof num_str, "%d", number); 
char *args[] = {"./isEven", num_str, NULL}; 
execvp("./isEven", args); 
perror("exec"); 

、あなたはerrnoを印刷しているとして:

printf(errno); 

printfはその最初の引数として文字列を期待するので、これは失敗します。上記のように、perror()を使用してエラーを印刷できます。

+0

私は一日を費やして、なぜそれが働いていないのか理解しようとしなかった... – Steven

+0

百万のお礼!!!! – Steven

関連する問題