1

したがって、基本的に、配列ごとに1つの引数を持つベクトル引数があり、UNIXでexecv()呼び出しに渡そうとしています。

Execv は次のような 2 つのパラメーターを受け入れます。 int execv(const char *path, char *const argv[]);

文字列のベクトルをポインタの配列に変換する最良の方法は何ですか? 現在、私は次のことを行っていますが、たとえば ps -a -f で実行すると、 ps は私に不正な引数を言って怒鳴ります。どんな助けでも大歓迎です。

vector<string> args = tokenize(cmd);
char * arg[args.size()];
for(int j=0; j<args.size();j++)
{
        arg[j] = (char*)args[j].c_str();    
}
retval = execv(args[0].c_str(), arg);

.

>ps

  PID TTY           TIME CMD
  635 ttys000    0:00.18 -bash
16106 ttys000    0:00.00 ./test cpp
12590 ttys001    0:00.02 -bash
>ps -a

ps: illegal argument: ?????
4

2 に答える 2

5

あなたの問題は、配列の最後に NULL を入れることを怠っている可能性があると思います。これを試して:

char * arg[args.size()+1];
arg[args.size()] = NULL;
for (int j=0; [...]
于 2009-10-07T03:00:09.080 に答える
1

execv 関数は、新しいプログラムで使用できる引数リストを表すヌル終了文字列へのポインターの配列を提供します。最初の引数は、慣例により、実行中のファイルに関連付けられたファイル名を指す必要があります。ポインターの配列は、NULL ポインターで終了する必要があります。

于 2009-10-07T03:12:06.463 に答える