質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

1727閲覧

子プロセスの出力をパイプに流し、親プロセスでパイプを監視する方法

hkjhjkhkjify

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2020/07/09 08:18

編集2020/07/09 08:49

生成したプロセスでスクリプトを実行し、その結果を取得したいと考えております。
スクリプトは実行結果を標準または標準エラーに出力される為、パイプを2本用意して
そこから結果を読み取ろうと試みております。
スクリプトの処理に時間がかかるため非同期で2つのパイプを監視し、
パイプに出力があるまでWaitする方法(監視方法)がわかりません。

<行ったこと>

  1. 名前付きパイプの生成
  2. 子プロセス側(パイプの出力側)のハンドル取得 CreateFile(1のパイプ名)
  3. 子プロセスのSTATUPINFOのhStdOutput, hStdErrorに2のハンドルを指定
  4. 子プロセス生成 CreateProcess(実行スクリプトPATHを指定)

ここで子プロセスの終了を待って(WaitForSingleObject(pi.hProcess, INFINITE))
ReadFileでパイプの中身を確認する事が出来ました。

プロセス終了ではなくパイプに書き込みがあるまでWaitするにはどうすれば良いでしょうか?
(select関数のような事がしたいのですが、CreateEventでイベント通知出来るのかな?)

または、他の方法があれば教えてください。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

名前付きパイプを使っているのならば
CreateNamedPipe呼び出し時にdwOpenModeにFILE_FLAG_OVERLAPPEDを追加で指定する事で
ReadFile成功時にイベント呼び出しさせる事ができます。

c++

1OVERLAPPED ol{}; 2ol.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 3HANDLE handles[] = {pi.hProcess, ol.hEvent}; 4BOOL br = ReadFile(readPipe, buf, sizeof(buf), NULL, &ol); 5auto err = GetLastError(); 6if(!br && err == ERROR_IO_PENDING){ 7 // 非同期読み取り中 8 DWORD r = WaitForMultipleObjects(std::size(handles), handles, false, INFINITE); 9 if(r == 1){ // 読み取り完了 10 DWORD transferd = 0; 11 BOOL result = GetOverlappedResult(readPipe, &ol, &transferd, false); 12 buf[transferd] = 0; 13 puts(buf); 14 }else if(r == 0){ 15 // プロセスが終了した。 16 }else{ 17 // なんらかのエラーもしくはハンドルが閉じられた 18 } 19}

ただし、子プロセスが書き込みをフラッシュしない限り読み取りは完了しないので
結果が意図通りかは微妙なところです。

投稿2020/07/11 00:01

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2020/07/11 01:28

>子プロセスが書き込みをフラッシュしない限り こういう時って、バッファサイズ 0にするのではなかったでしょうか? 最近、書いてないでちょっと自信はないですが。
hkjhjkhkjify

2020/07/14 13:10

解答ありがとうございました。 今回はPeekNamedPipeで対応しましたが、コードも記載して頂いたのでベストアンサーとさせて頂きます。
退会済みユーザー

退会済みユーザー

2020/07/14 14:52

なんか解決に使った方法じゃない方がベストアンサーにされるって釈然としないっすね。 まあいいけど。
guest

0

試してはいませんが、PeekNamedPipeで読取可能サイズが0以外になるまでループでチェックするとかではどうですかね。

投稿2020/07/10 07:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問