0

コマンドを実行し、cmd のように結果を返す必要があります。

この要件を満たす唯一の方法を見つけました。 popen 関数を使用してコマンドを実行し、結果を返し、 pclose() 関数を使用してストリームを閉じて処理しました。

しかし、「ping 8.8.8.8 –t」のようにコマンドが終わらない場合、pclose()関数を使用してプロセスを閉じることができません。

popen() で作成した子プロセスをタスクマネージャで kill すると、pclose 関数は正常に動作します。

popen to kill によって作成されたプロセスIDを取得するにはどうすればよいですか?

===================
そして :
Windows で _popen() を使用する場合、PID を取得するにはどうすればよいですか?

4

3 に答える 3

0

popen() は、execve() またはその他の exec 関数を使用して記述されています。

あなたがすることは、(1)2つのファイル記述子を提供するpipe()でパイプのペアを作成することです。1 つは標準入力用で、もう 1 つは標準出力用です。次に、子プロセスで fork() および execve() を実行します。fork() を呼び出した時点で、子プロセスが取得されます。

popen() によって返されるファイルは FILE* です。これを pipe() から取得するには、fdopen() を実行する必要があります。難しすぎない。

それはかなりの作業ですが、識別子が必要な場合は...

さて... MS-Windows では少し異なり、CreatePipe() や CreateProcess() などの関数を使用します。しかし、結果は似ています。

于 2013-09-24T05:18:53.007 に答える