だからここに私に問題を与えている私のコードのビットがあります:
void childProcessHandler(string command){
int argCounter = 0;
for(int i=0; i!=command.size(); i++)
argCounter+=( command.at(i) == ' ');
char * temp, *token;
char *childArgs[argCounter];
argCounter = 1;
temp = new char [command.size()+1];
strcpy (temp, command.c_str());
token = strtok (temp," ");
childArgs[0] = token;
while (token!=NULL)
{
token = strtok(NULL," ");
childArgs[argCounter] = token;
argCounter++;
}
//delete[] temp; //Should remove token as well?
execvp(childArgs[0], childArgs);
cout<<"PROBLEM!"<<endl;
exit(-1);
}
main() メソッドで、私のコードは forks() (親プロセスは子が終了するのを待機する) のポイントに到達し、子プロセス (プロセス ID == 0 はい?) は、ユーザーでメソッド childProcessHandler を呼び出します。入力 (実行するコマンド + 引数) を引数として使用します。次に、ユーザー入力をトークン化し、execvp を呼び出します。
すべてがコンパイルされ、実行されます。execvp はエラーが発生した場合にのみ戻るため、execvp の後の行には到達しません。
プロジェクトはUNIX端末をシミュレートすることですが、コマンド「日付」を指定すると、何も出力されません...子が終了し、親プロセスは正常に再開しますが、端末ウィンドウには何も送信されません...
私は何を間違っていますか?
(また、strtokを使用してトークン化することを「推奨」されましたが、もっと簡単なものがあれば、私は意見を受け入れます。)
ありがとう!
編集
たとえば、「date」の代わりに「date」と入力すると、上記のコードが機能します。childArgs[]配列の最後にnull文字を入れない「トークナイザー」には、何か怪しいものがあるのではないかと思います。私はそれで遊んでみます。素早い回答に感謝します!
(Ninja編集、delete[] tempも一応コメントアウト)