0

この問題があります。cmd コマンドを実行する必要がある C コードのサーバーを作成しています。main() は新しいスレッドを作成する必要があり、このスレッドは、この cmd コマンドを開始して結果を送り返す必要がある新しいプロセスを作成する必要があります。

コマンドが出力 (dir、netstat、ls など) のみを送り返す場合、これは正常に機能します。しかし、「日付」として入力を待機するコマンド (新しい日付を待機するコマンド) を使用しようとすると、新しいプロセスがフリーズします。新しいプロセスのハンドルで WaitForSingleObject を使用し、タイムアウトを使用できるため、これを解決することはできません。プロセスがしばらく終了しない場合は、TerminateProcess() を使用してプロセスを終了できます。

ただし、プロセス cmd.exe を使用すると、サーバーのプロセスによって開始され、閉じられないため、引き続き実行されます。

入力が必要なコマンドは気にしません。無視したいだけなので、_popen が何かを待っている場合は、単に cmd を閉じて戻ります。

入力を必要とするコマンドで _popen がフリーズするこの状況を回避する方法はありますか?

_popen を実行するプロセスのコードは次のとおりです。

char readBuff[8096];
DWORD readed;
ReadFile(pipe,readBuff,8096,&readed,NULL);
FILE * out=_popen(commandToExec,"r"); //assume commandToExec contains "date" 
char buffer[128];
char output[8096];
output[0]='\0';
while(fgets(buffer, 128, out)){
    snprintf(output,8096,"%s%s\n",outputComando,buffer);
}
DWORD writed;
WriteFile(pipe,outputComando,8096,&scritti,NULL); //it writes the output to a pipe

これは、出力のみのコマンドでは正常に機能しますが、入力が必要なコマンドの「while」には到達しません (デバッグしました)。

4

1 に答える 1

1

popenのmsdnページによると、stdinとstoutの両方をリダイレクトするには追加の作業が必要です

http://msdn.microsoft.com/en-us/library/ms682499.aspx

于 2012-04-26T18:38:17.697 に答える