私はCポインターが初めてで、コマンドラインでプロセスを実行してpidを取得しようとしています。コマンドラインを使用するsystem()、sh()などのいずれもpidを返さないため、execve()を使用することにしました。ただし、コマンドラインを解析して文字列配列にする必要があります。
既存のソリューションをいくつか見つけましたが、機能させることができませんでした。だから、私は自分自身を書きました。私のテスト プログラムでは動作しますが、実際のプログラムではセグメンテーション エラーが発生します。どこが間違っているのか、誰か教えてもらえますか? コードは次のとおりです。
void cmdline_to_argv(const char* cmd_line, char*** argv, int* argc){
int len, i, count, spc;
char *s,*d;
/* make a copy to play with */
char *cmd_line1 = strdup(cmd_line);
/* count items to deal with and trim multiple spaces */
d = s = cmd_line1; spc = 1; count = 0; len=strlen(cmd_line1);
for (i=0; i<len;i++,s++) {
switch (*s) {
case ' ':
if (spc) continue;
*d++ = '\0'; /* replace spaces with zeroes */
spc = 1;
break;
default:
if (spc) { count++; spc = 0; }
*d++ = *s;
}
}
(*d++) = '\0'; /* line termination */
/* reallocate copy to correct size */
cmd_line1 = realloc( cmd_line1, d - cmd_line1);
/* allocate array of poiters */
*argv = (char**) malloc(sizeof(char*) * (count+1));
argv[count] = NULL;
/* scan line again to find all lines starts and register */
s = cmd_line1;
for (i=0; i<count; i++) {
(*argv)[i] = s;
while (*(s++)) ;
}
*argc = count;
}
そして、私がそれを呼ぶ方法があります:
char **chargv = NULL;
int chargc;
/* parse line to argument array */
cmdline_to_argv(cmdline, &chargv, &chargc);
ここで、配列を割り当てて書き込むポインター操作ですべての問題が発生すると思います。どうすれば正しいですか?