Aracılığıyla paylaş


_pipe

Okuma ve yazma için bir kanal oluşturur.

Önemli

Bu API yürütün uygulamalarda kullanılamaz Windows Çalışma Zamanı.Daha fazla bilgi için bkz: /zw ile desteklenmeyen crt işlevlerinin.

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

Parametreler

  • pfds[2]
    Okuma tutun ve dosya tanımlayıcıları yazmak için dizi.

  • psize
    Rezerve etmek için bellek miktarı.

  • textmode
    Dosya modu.

Dönüş Değeri

Başarılı olursa 0 değerini döndürür. Bir hatayı göstermek için –1 değerini döndürür. Hata, errno bu değerlerden birini ayarlayın:

  • EMFILE, daha fazla hiçbir dosya tanımlayıcıları kullanılabilir olduğunu gösterir.

  • ENFILE, sistem dosya tablosu taşması gösterir.

  • EINVAL, hangi gösterir ya da dizi pfds null bir işaretçidir veya geçersiz bir değer için textmode geçildi.

Bunlar ve diğer dönüş kodları hakkında daha fazla bilgi için bkz: errno, _doserrno, _sys_errlist ve _sys_nerr.

Notlar

_pipe İşlev oluşturur bir kanal, bir program diğer programlara bilgi geçirmek için kullanılan yapay bir g/ç kanalı değil. Bir kanal bir dosyayı dosya işaretçisini dosya tanımlayıcısı veya her ikisini de sahip ve okunabilen veya yazılabilen standart kitaplığı kullanarak giriş ve çıkış işlevleri nedeniyle benzer. Ancak, dikey çizgi, belirli bir dosya veya aygıta göstermiyor. Bunun yerine, programın kendi bellek bağımsızdır ve tamamen işletim sistemi tarafından denetlenen bellekte geçici depolama temsil eder.

_pipebenzer _open , ancak okuma ve yazma için kanal açar ve iki dosya tanımlayıcıları yerine döndürür. Program kanal her iki tarafına kullanabilir veya yazıldığı birini kapatın. Örneğin, aşağıdaki gibi bir komut çalýþtýrdýðýnda, Windows komut işlemcisi bir kanal oluşturur PROGRAM1 | PROGRAM2.

Standart çıkış tanımlayıcısını PROGRAM1 kanal 's yazma tanımlayıcısı için bağlı. Standart giriş tanımlayıcısını PROGRAM2 kanal 's okuma tanımlayıcısı için bağlı. Bu diğer programlara bilgi geçirmek için geçici dosyaları oluşturma gereğini ortadan kaldırır.

_pipe İşlevini verir iki dosya tanımlayıcıları kanala pfds bağımsız değişkeni. Öğe pfds[0] okuma tanımlayıcısı ve öğeyi içeren pfds[1] yazma tanımlayıcısı içerir. Kanal dosya tanımlayıcıları tıpkı diğer dosya tanımlayıcısı olarak kullanılır. (Alt düzey giriş ve çıkış işlevlerini _read ve _write okuma ve yazma için dikey çizgi.) Kanal bitiş koşulunu algılamak için denetleme bir _read isteği 0 okunan bayt sayısı olarak döndürür.

psize Bağımsız değişkeni kanal için ayrılacak bayt bellek miktarını belirtir. textmode Kanal için Çeviri Modu bağımsız değişkenini belirtir. Bildirim sabitine _O_TEXT bir metin çevirisi ve sabit belirtir _O_BINARY ikili çeviri belirtir. (Bkz: fopen, _wfopen bir metin ve ikili modları açıklaması.) textmode Bağımsız değişken ise 0, _pipe varsayılan modu değişkeni tarafından belirtilen varsayılan çeviri modu kullanan _fmode.

Çoklu iş parçacığı kullanan programlarda hiçbir kilitleme gerçekleştirilir. Döndürülen dosya tanımlayıcıları yeni açılır ve sonra kadar herhangi bir iş parçacığı tarafından başvurulması gerekir değil _pipe çağrısı tamamlandı.

Kullanmak için _pipe bir alt işlem üst işleminin arasında iletişim kurmak için işlev, her işlem kanalda açmak yalnızca bir tanımlayıcısı olmalıdır. Opposites tanımlayıcıları olmalıdır: üst açmak bir okuma tanımlayıcısına sahip sonra alt açık bir yazma tanımlayıcısı olmalıdır. Bunu yapmak için en kolay yolu OR () |) the _O_NOINHERIT flag with textmode. Daha sonra _dup veya _dup2 , alt geçirmek istediğiniz kanal tanımlayıcısı devralınabilir bir kopyasını oluşturmak için. Özgün tanımlayıcısını kapatın ve sonra alt işlemi spawn. Spawn çağrısından dönen üzerinde yinelenen üst işlemin tanımlayıcısı kapatın. Daha fazla bilgi için bu makalenin sonraki bölümlerinde örnek 2 bakın.

Kapalı tüm tanımlayıcıları, Windows işletim sisteminde, bir kanal yok edilir. (Kanal üzerinde okuma tüm tanımlayıcıları kapattıysanız, sonra kanala yazılırken bir hata oluşur.) Tüm okuma ve kalmayıncaya kadar yeterli veri veya g/ç isteği tamamlamak için yeterli arabellek alanı yazma işlemleri üzerinde kanal bekleyin.

Gereksinimler

Yordamı

Gerekli başlık

İsteğe bağlı üstbilgi

_pipe

<io.h>

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

1 İçin _O_BINARY ve _O_TEXT tanımlar.

2 errno tanımlar.

Daha fazla uyumluluk bilgileri için bkz: Uyumluluk.

Kitaplıkları

Tüm sürümleri c çalışma zamanı kitaplıkları.

Örnek 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 ) );

      }
   }
}

Örnek Çıktı

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.

Örnek 2

Temel filtre uygulama budur. Filtreyi kapatmasına uygulamanın STDOUT'a yönlendiren bir kanal oluşturur sonra uygulama crt_pipe_beeper olarak çoğaltılır. Filtre ASCII 7 (bip) karakterleri kaldırır.

// 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;
}

Gerçek filtre uygulama:

// 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;
}

Çıktı

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 Eşdeğeri

Yoktur. Standart c işlevi çağırmak için kullanın PInvoke. Daha fazla bilgi için bkz. Platform Çağırma örnekleri.

Ayrıca bkz.

Başvuru

İşlem ve ortam denetimi

_open, _wopen