次の方法で共有


_pipe

読み取りおよび書き込み用のパイプを作成します。

重要 : 重要

この API は Windows ランタイムで実行されるアプリケーションで使用することはできません。詳細については、でサポート /ZW CRT 関数" "を参照してください。

int _pipe( int *pfds, unsigned int psize, int textmode );

パラメーター

  • pfds[2]
    格納した配列はファイル記述子を読み取ったり書き込んだりします。

  • psize
    事前にメモリの量。

  • textmode
    ファイル モード。

戻り値

処理が正常に終了した場合は 0 を返します。–1 をエラーを示すを返します。エラーの場合、errno は、これらの値の 1 に設定されます:

  • EMFILE、これ以上のファイル記述子が使用できないことを示す。

  • ENFILE、ファイル システム テーブルのオーバーフローを示します。

  • EINVAL、配列 pfds が null ポインターの場合、または textmode に対して無効な値が渡されたことを示します。

これらのプロパティおよびそのほかのリターン コードに関する詳細については、errno、_doserrno、_sys_errlist、および _sys_nerrを参照してください。

解説

_pipe 関数は、プログラムの他のプログラムに情報を渡すために使用する人為的な I/O チャネルである パイプを作成します。パイプは、ファイル ポインター、ファイル記述子、またはその両方を持つ、から読み込まれたか、標準ライブラリの入出力関数を使用してに書き込むことができます。ファイルに似ており。ただし、パイプは、特定のファイルまたはデバイスを表しません。代わりに、独自のプログラムのメモリに関係なく、オペレーティング システムによって完全に制御するメモリの一時的なストレージを表します。

_pipe 開くには _open 読み取りおよび書き込み用のパイプが似ており、1 種類の代わりに 2 ファイル記述子を返します。プログラムはパイプの両側を使用するか、必要としない 1 を閉じることができます。たとえば、Windows のコマンド プロセッサは PROGRAM1 | PROGRAM2のようにコマンドを実行するとパイプを作成します。

PROGRAM1 の標準出力に記述子はパイプの書き込み記述子にアタッチされます。PROGRAM2 の標準入力記述子はパイプの読み込み記述子にアタッチされます。これにより、他のプログラムに情報を渡すに一時ファイルを作成する必要がなくなります。

_pipe 関数は pfds の引数でパイプに 2 ファイル記述子を返します。要素 pfds[0]読み込み記述子と要素 pfds[1]があります書き込みの記述子が含まれます。パイプのファイル記述子は、他のファイル記述子と同様に使用します。(低水準入出力関数 _read_write はパイプを読み書き読み取ることができます)。終わりのパイプの状態を検出するには、読み取ったバイト数が 0 を返すように _read の要求をチェックします。

psize の引数は、バイトで、パイプのために予約するメモリ量を指定します。textmode の引数はパイプの変換モードを指定します。マニフェスト定数 _O_TEXT は、テキストの移動を指定し、定数 _O_BINARY はバイナリ移動を指定します。(テキストと binary モードの詳細については、fopen、_wfopen を参照してください)。textmode の引数が 0 の場合、_pipe は既定の変換モード _fmodeモードの変数で指定されている既定値が使用されます。

マルチスレッド プログラムでは、ロックは実行されません。返されたファイル記述子が更新に開いてして、スレッドによって _pipe の後に呼び出しが完了するまで参照することはできません。

_pipe の関数を使用するには、各プロセスは、親プロセスと子プロセスの間の通信にパイプで開いている 1 種類の記述子のみ必要です。記述子がオブジェクトである必要があります: 親は読み込み記述子に、子は書き込みの記述子を開いておく必要があります。これを行う簡単な方法は OR になります。|textmode) の _O_NOINHERIT のフラグ。次に、子に渡すときに、パイプの記述子の継承可能なコピーを作成するか _dup 使用 _dup2。元の記述子を終了し、子プロセスを産んでします。卵の呼び出しから返されることで、親プロセスの重複記述子を閉じます。詳細については、この記事の 2 例を参照してください。

Windows オペレーティング システムでは、パイプはすべて記述子が閉じている場合は破棄されます。すべてを読み取る場合は (パイプの記述子が閉じられました、パイプへの書き込みは、エラーが発生します。)パイプは、すべての待機操作を読み取り、I/O 要求を完了するために十分なデータまたは十分なバッファー領域になるまで書き込みます。

必要条件

ルーチン

必須ヘッダー

オプション ヘッダー

_pipe

<io.h>

<fcntl.h>、1 <errno.h>2

1 _O_BINARY_O_TEXT の定義に対して。

errno の 2 種類の定義。

互換性の詳細については、互換性を参照してください。

ライブラリ

C ランタイム ライブラリのすべてのバージョン。

例 1

// crt_pipe.c
/* This program uses the _pipe function to pass streams of
 * text to spawned processes.
 */

#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <process.h>
#include <math.h>

enum PIPES { READ, WRITE }; /* Constants 0 and 1 for READ and WRITE */
#define NUMPROBLEM 8

int main( int argc, char *argv[] )
{

   int fdpipe[2];
   char hstr[20];
   int pid, problem, c;
   int termstat;

   /* If no arguments, this is the spawning process */
   if( argc == 1 )
   {

      setvbuf( stdout, NULL, _IONBF, 0 );

      /* Open a set of pipes */
      if( _pipe( fdpipe, 256, O_BINARY ) == -1 )
          exit( 1 );


      /* Convert pipe read descriptor to string and pass as argument 
       * to spawned program. Program spawns itself (argv[0]).
       */
      _itoa_s( fdpipe[READ], hstr, sizeof(hstr), 10 );
      if( ( pid = _spawnl( P_NOWAIT, argv[0], argv[0], 
            hstr, NULL ) ) == -1 )
          printf( "Spawn failed" );

      /* Put problem in write pipe. Since spawned program is 
       * running simultaneously, first solutions may be done 
       * before last problem is given.
       */
      for( problem = 1000; problem <= NUMPROBLEM * 1000; problem += 1000)
      {

         printf( "Son, what is the square root of %d?\n", problem );
         _write( fdpipe[WRITE], (char *)&problem, sizeof( int ) );

      }

      /* Wait until spawned program is done processing. */
      _cwait( &termstat, pid, WAIT_CHILD );
      if( termstat & 0x0 )
         printf( "Child failed\n" );


      _close( fdpipe[READ] );
      _close( fdpipe[WRITE] );

   }

   /* If there is an argument, this must be the spawned process. */
   else
   {

      /* Convert passed string descriptor to integer descriptor. */
      fdpipe[READ] = atoi( argv[1] );

      /* Read problem from pipe and calculate solution. */
      for( c = 0; c < NUMPROBLEM; c++ )
      {

        _read( fdpipe[READ], (char *)&problem, sizeof( int ) );
        printf( "Dad, the square root of %d is %3.2f.\n",
                 problem, sqrt( ( double )problem ) );

      }
   }
}

出力例

Son, what is the square root of 1000?
Son, what is the square root of 2000?
Son, what iDad, the square root of 1000 is 31.62.
Dad, the square root of 2000 is 44.72.
s the square root of 3000?
Dad, the square root of 3000 is 54.77.
Son, what is the square root of 4000?
Dad, the square root of 4000 is 63.25.
Son, what is the square root of 5000?
Dad, the square root of 5000 is 70.71.
Son, what is the square root of 6000?
SonDad, the square root of 6000 is 77.46.
, what is the square root of 7000?
Dad, the square root of 7000 is 83.67.
Son, what is the square root of 8000?
Dad, the square root of 8000 is 89.44.

例 2

これは基本的なフィルターのアプリケーションです。これは、フィルターに起動されたアプリケーションの標準出力を指示するパイプを作成した後、アプリケーションの crt_pipe_beeper を生成します。フィルターは ASCII を 7 個の (ビープ音) の文字削除します。

// crt_pipe_beeper.c

#include <stdio.h>
#include <string.h>

int main()
{
   int   i;
   for(i=0;i<10;++i)
      {
         printf("This is speaker beep number %d...\n\7", i+1);
      }
   return 0;
}

実際のフィルターのアプリケーション:

// crt_pipe_BeepFilter.C
// arguments: crt_pipe_beeper.exe

#include <windows.h>
#include <process.h>
#include <memory.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

#define   OUT_BUFF_SIZE 512
#define   READ_FD 0
#define   WRITE_FD 1
#define   BEEP_CHAR 7

char szBuffer[OUT_BUFF_SIZE];

int Filter(char* szBuff, ULONG nSize, int nChar)
{
   char* szPos = szBuff + nSize -1;
   char* szEnd = szPos;
   int nRet = nSize;

   while (szPos > szBuff)
   {
      if (*szPos == nChar)
         {
            memmove(szPos, szPos+1, szEnd - szPos);
            --nRet;
         }
      --szPos;
   }
   return nRet;
}

int main(int argc, char** argv)
{
   int nExitCode = STILL_ACTIVE;
   if (argc >= 2)
   {
      HANDLE hProcess;
      int fdStdOut;
      int fdStdOutPipe[2];

      // Create the pipe
      if(_pipe(fdStdOutPipe, 512, O_NOINHERIT) == -1)
         return   1;

      // Duplicate stdout file descriptor (next line will close original)
      fdStdOut = _dup(_fileno(stdout));

      // Duplicate write end of pipe to stdout file descriptor
      if(_dup2(fdStdOutPipe[WRITE_FD], _fileno(stdout)) != 0)
         return   2;

      // Close original write end of pipe
      _close(fdStdOutPipe[WRITE_FD]);

      // Spawn process
      hProcess = (HANDLE)_spawnvp(P_NOWAIT, argv[1], 
       (const char* const*)&argv[1]);

      // Duplicate copy of original stdout back into stdout
      if(_dup2(fdStdOut, _fileno(stdout)) != 0)
         return   3;

      // Close duplicate copy of original stdout
      _close(fdStdOut);

      if(hProcess)
      {
         int nOutRead;
         while   (nExitCode == STILL_ACTIVE)
         {
            nOutRead = _read(fdStdOutPipe[READ_FD], 
             szBuffer, OUT_BUFF_SIZE);
            if(nOutRead)
            {
               nOutRead = Filter(szBuffer, nOutRead, BEEP_CHAR);
               fwrite(szBuffer, 1, nOutRead, stdout);
            }

            if(!GetExitCodeProcess(hProcess,(unsigned long*)&nExitCode))
               return 4;
         }
      }
   }
   return nExitCode;
}

出力

This is speaker beep number 1...
This is speaker beep number 2...
This is speaker beep number 3...
This is speaker beep number 4...
This is speaker beep number 5...
This is speaker beep number 6...
This is speaker beep number 7...
This is speaker beep number 8...
This is speaker beep number 9...
This is speaker beep number 10...

同等の .NET Framework 関数

該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

関連項目

プロセス制御と環境制御

_open、_wopen