Sdílet prostřednictvím


_pipe

Vytvoří kanál pro čtení a zápis.

Důležitá poznámkaDůležité

Toto rozhraní API nelze použít v aplikacích, které jsou spuštěny v Windows Runtime.Další informace naleznete v tématu CRT funkce nejsou podporovány s /ZW.

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

Parametry

  • pfds[2]
    Pole držet čtení a zápis popisovače souboru.

  • psize
    Velikost paměti pro rezervaci.

  • textmode
    Režim souboru.

Vrácená hodnota

Pokud je úspěšná, vrátí hodnotu 0.Vrátí hodnotu –1 udávající chybu.Při chybě errno je nastavena na jednu z těchto hodnot:

  • EMFILE, což znamená, že jsou k dispozici žádné další popisovače souboru.

  • ENFILE, který označuje přetečení tabulky systému souborů.

  • EINVAL, což znamená, že buď pole pfds je ukazatel s hodnotou null nebo neplatnou hodnotu pro textmode byl předán.

Další informace o těchto i jiných návratové kódy, viz Kód chyby, _doserrno, _sys_errlist a _sys_nerr.

Poznámky

_pipe Funkce vytvoří kanálu, což je umělé vstupně-výstupní kanál, který program používá k předávání informací do jiných programů.Svislé čáry se podobá souboru protože má ukazatel na soubor či popisovače souboru a může číst nebo zapisovat pomocí standardní knihovny vstupní a výstupní funkce.Kanál však nepředstavuje konkrétní soubor nebo zařízení.Místo toho představuje dočasné úložiště v paměti, který je nezávislý program v paměti a je plně řízena operačního systému.

_pipese podobá _open , ale otevře kanál pro čtení a zápis a vrátí dvě souboru popisovače namísto jednoho.Program můžete použít obě strany kanálu nebo zavřít ten, který není nutné.Například příkazového procesoru v systému Windows vytváří kanál, jakmile je spuštěn příkaz, jako je například PROGRAM1 | PROGRAM2.

Standardní výstupní popisovač PROGRAM1 se připojuje k popisovače pro zápis do kanálu.Standardní vstupní popisovač PROGRAM2 se připojuje k čtení popisovače do kanálu.To eliminuje potřebu vytvářet dočasné soubory pro předávání informací do jiných programů.

_pipe Funkce vrátí dva popisovače souboru pro přesměrování v pfds argument.Prvek pfds[0] obsahuje čtení popisovače a element pfds[1] obsahuje zápis popisovače.Popisovače souborů potrubí se používají stejným způsobem jako ostatní popisovače souboru.(Nižší úrovně vstup a výstup funkce _read a _write lze číst a zapisovat do kanálu.) Rozpoznat podmínku ukončení potrubí, vyhledat _read požadavek, který vrací 0 jako počet bajtů přečtených.

psize Argument určuje velikost paměti v bajtech, vyhradit pro kanál.textmode Argument určuje režim překladu pro kanál.Konstanta manifestu _O_TEXT Určuje text překlad a konstanta _O_BINARY Určuje binární překlad.(Viz fopen _wfopen popis textu a binární režim.) Pokud textmode argumentu je 0, _pipe používá výchozí režim překladu zadaného pomocí parametru proměnná výchozí režim _fmode.

Žádné uzamčení se provádí v programů s více vlákny.Popisovače souborů, které jsou vráceny nově otevřených a neměly odkazovat pomocí libovolného vlákna až po _pipe dokončení volání.

Chcete-li použít _pipe fungovat ke komunikaci mezi procesem nadřazený a podřízený proces, každý proces musí mít pouze jeden popisovač otevřít na kanálu.Popisovačích musí být opposites: Pokud má nadřazená čtení popisovače, otevřete a potom dítěte musí mít popisovače zapisovat, otevřít.Nejjednodušší způsob je OR ()|) the _O_NOINHERIT flag with textmode.Potom pomocí _dup nebo _dup2 k vytvoření dědičné kopie popisovače kanálu, který chcete předat dítě.Zavřít původní popisovač a poté spustit podřízený proces.Při návratu z volání vypnuty, zavření duplicitní popisovač v nadřazeném procesu.Další informace naleznete v tématu příklad 2 dále v tomto článku.

V operačním systému Windows kanálu zničen, je-li všechny jeho popisovače byly uzavřeny.(Pokud byly uzavřeny všechny čtení popisovače na potrubí, pak zápis do kanálu způsobí chybu.) Všech operací čtení a zápisu na kanálu čekat dokud není k dispozici dostatečné množství dat nebo dostatek místa ve vyrovnávací paměti k dokončení vstupně-výstupní požadavek.

Požadavky

Byla zahájena rutina

Požadované záhlaví

Volitelné záhlaví

_pipe

<io.h>

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

1 Pro _O_BINARY a _O_TEXT definice.

2 errno definice.

Další informace o kompatibilitě v tématu Kompatibilita.

Knihovny

Všechny verze C run-time libraries.

Příklad 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 ) );

      }
   }
}

Vzorový výstup

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.

Příklad 2

Toto je základní filtr aplikace.Založí crt_pipe_beeper aplikace, po vytvoření kanálu, který přesměruje stdout vytvořená aplikace filtru.Filtr odstraní znaky ASCII 7 (zvukový signál).

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

Aktuální filtr aplikace:

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

Výsledek

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...

Ekvivalent v rozhraní .NET Framework

Nelze použít Volání funkce standardním C pomocí PInvoke. Další informace naleznete v tématu Příklady volání funkce platformy.

Viz také

Referenční dokumentace

Proces a řízení prostředí

_open, _wopen