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

您的第二个解决方案通常是好的解决方案,但如果您的平台上有它,请使用strdup而不是mallocandstrcpy一次性分配和复制字符串。如果你没有strdup,自己写一个也不会很困难。

此外,对于您的字符串数组,您不会感到惊讶,请执行以下操作:

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

正确初始化所有指针。

于 2012-06-22T20:52:51.650 回答