0

いくつかのフォーラムを読みましたが、これに対する解決策が見つかりません。

int sIndex = 3;
char serverArgs[serverCommandCount + 3][20];


strcpy(serverArgs[0], "ant");
strcpy(serverArgs[1], "-f");
strcpy(serverArgs[2], "/dev/server1/trunk/build.xml");
if(serverStop){strcpy(serverArgs[sIndex], "jboss-stop"); sIndex++;}
if(serverClean){strcpy(serverArgs[sIndex], "clean"); sIndex++;}
if(serverDeploy){strcpy(serverArgs[sIndex], "deploy"); sIndex++;}
if(releaseDB){strcpy(serverArgs[sIndex], "releasedb"); sIndex++;}
if(createDB){strcpy(serverArgs[sIndex], "createdb"); sIndex++;}
if(serverStart){strcpy(serverArgs[sIndex], "jboss-start"); sIndex++;}
if(serverDebug){strcpy(serverArgs[sIndex], "jboss-start-debug"); sIndex++;}

execv(antEx, serverArgs);

このソリューションの問題は、execv が char[ ] ではなく char *[ ] を必要としていることです。

int sIndex = 3;
char *serverArgs[serverCommandCount + 3];

for(index = 0; index < serverCommandCount + 3; index++)
    serverArgs[index] = malloc(20);
strcpy(serverArgs[0], "ant");
strcpy(serverArgs[1], "-f");
strcpy(serverArgs[2], "/dev/server1/trunk/build.xml");
if(serverStop){strcpy(serverArgs[sIndex], "jboss-stop"); sIndex++;}
if(serverClean){strcpy(serverArgs[sIndex], "clean"); sIndex++;}
if(serverDeploy){strcpy(serverArgs[sIndex], "deploy"); sIndex++;}
if(releaseDB){strcpy(serverArgs[sIndex], "releasedb"); sIndex++;}
if(createDB){strcpy(serverArgs[sIndex], "createdb"); sIndex++;}
if(serverStart){strcpy(serverArgs[sIndex], "jboss-start"); sIndex++;}
if(serverDebug){strcpy(serverArgs[sIndex], "jboss-start-debug"); sIndex++;}

execv(antEx, serverArgs);

この方法で試してみると、実行しようとするとセグメンテーション違反が発生します

strcpy(serverArgs[1], "-f");

私は何が欠けていますか?

4

3 に答える 3

2

私のコメントを答えに変える:行 strcpy(serverArgs[2], "/dev/server1/trunk/build.xml"); 文字列が 20 文字を超えています。malloc配列に入る可能性のあるすべてのものに対して十分なスペースがあることを完全に確認する必要があります。

于 2012-06-22T21:17:25.273 に答える
1

次のマニュアルページを確認してくださいexecv

ポインターの配列は、NULL ポインターで終了する必要があります。

于 2012-06-22T20:37:49.013 に答える
0

2番目のソリューションは一般的に優れたソリューションですが、プラットフォームにある場合は、との代わりにを使用して、strdup文字列を一度に割り当ててコピーします。持っていない場合は、自分で書くのはそれほど難しいことではありません。mallocstrcpystrdup

また、文字列配列に驚きがないようにするには、次のようにします。

char *serverArgs[serverCommandCount + 3] = { 0 };

すべてのポインタを正しく初期化します。

于 2012-06-22T20:52:51.650 に答える