<CENTER><H1><HR>DosConnectNPipe<HR></H1></CENTER>
</A>
<P>DosConnectNPipe prepara un <I>''named pipe</I>'' para aceptar peticiones <B>'''DosOpen</B>''' desde un cliente. Si el extremo del cauce ya estaba abierto, <B>'''DosConnectNPipe</B>''' retorna inmediatamente. Si no es así, depende del modo en que haya sido definida. Si es <B>'''blocking</B>''', el proceso servidor se congela hasta que un cliente habra el cauce; si es <B>'''nonblocking</B>''', retorna inmediatamente con el error <B>'''Cauce no abierto</B>'''. Si el cauce fue abierto y luego cerrado por un cliente, pero no ha sido desconectado con <B>'''DosDisConnectNPipe</B>''' por el servidor, retorna un error <B>'''El cauce está cerrado</B>''' (<B>'''Error_Broken_Pipe</B>'''). Si es un cliente quien ejecuta esta llamada, se devuelve el error <B>'''Cauce incorrecto</B>'''.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>HPIPE hpipeHandle;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosConnectNPipe(hpipeHandle);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>El handle de un <I>named pipe</I> a ser activado (devuelto al proceso servidor por <B>DosCreateNPipe</B>).</TD></TR>
! <H3>Parámetros</H3>
|-
</TABLE>
| hpipeHandle
<P><TABLE><TH><H3>Codigos de error</H3></TH>
| El handle de un ''named pipe'' a ser activado (devuelto al proceso servidor por '''DosCreateNPipe''').
<TR><TD>0</TD><TD>Sin error</TD></TR>
|}
<TR><TD>95</TD><TD>Interrupción</TD></TR>
<P>
<TR><TD>109</TD><TD>El cauce (<I>pipe</I>) está cerrado</TD></TR>
{|
! <H3>Codigos de error</H3>
<TR><TD>230</TD><TD>Cauce incorrecto</TD></TR>
|-
<TR><TD>233</TD><TD>Cauce no abierto</TD></TR>
| 0 || Sin error
</TABLE>
|-
| 95 || Interrupción
|-
| 109
| El cauce (''pipe'') está cerrado
|-
| 230 || Cauce incorrecto
|-
| 233 || Cauce no abierto
|}
<P>
<P><A NAME="DOSCREATENPIPE"><CENTER><H1><HR>DosCreateNPipe<HR></H1></CENTER>
</A>
<P>DosCreateNPipe crea un <I>''named pipe</I>''.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>PSZ pszFileName;
<BRbr />PHPIPE phpipePipeHandle;
<BRbr />ULONG ulOpenMode;
<BRbr />ULONG ulPipeMode;
<BRbr />ULONG ulOutBufSize;
<BRbr />ULONG ulInBufSize;
<BRbr />ULONG ulTimeOut;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosCreateNPipe(pszFileName, phpipePipeHandle, ulOpenMode, ulPipeMode, ulOutBufSize, ulInBufSize, ulTimeOut);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>pszFileName</TD><TD>Puntero a una cadena de caracteres con el nombre del cauce a crear. Es necesario que comience con el prefijo \PIPE\ y cumplir las normas de nombres del sistema de archivos.</TD></TR>
! <H3>Parámetros</H3>
<TR><TD>phpipePipeHandle</TD><TD>Un puntero a una zona de memoria donde OS/2 devolverá un handle al cauce que estamos creando.</TD></TR>
|-
| pszFileName
| Puntero a una cadena de caracteres con el nombre del cauce a crear. Es necesario que comience con el prefijo \PIPE\ y cumplir las normas de nombres del sistema de archivos.
|-
| phpipePipeHandle
| Un puntero a una zona de memoria donde OS/2 devolverá un handle al cauce que estamos creando.
|-
| ulOpenMode
| Una variable cuyos bits tienen el siguiente significado:
|-
|
||
{| BORDER="1"
|-
<TD><U>Bit</U>
<TR><TD>ulOpenMode</TD><TD>Una variable cuyos bits tienen el siguiente significado:</TD></TR>
| <U>Descripción</U>
<TR><TD></TD><TD>
|-
<TABLE BORDER=1>
| 31-16 || Reservado
<TR>
|-
<TD><U>Bit</U></TD>
| 15 || Reservado. Tiene que ser 0.
<TD><U>Descripción</U></TD>
|-
</TR>
| 14
<TR>
| Write-through. Tiene sentido en el caso de cauces remotos (en otro sistema conectado en red). Si es 0, los datos a enviar pueden ser almacenados en un buffer con el fin de enviarlos todos juntos. Si es 1, los datos serán enviados inmediatamente.
<TD>31-16</TD>
|-
| 13-8 || Reservado
|-
| 7
| Bit de herencia. Si es 0, el cauce pertenecerá también a los procesos hijos. Si es 1, será un cauce privado, y no será heredado por ningún hijo.
|-
| 6-3 || Reservado. Tiene que valer 0.
|-
| 2-0
| Modo de acceso. Indica el sentido de los datos:<br />000 = (NP_ACCESS_INBOUND) cauce de entrada (del cliente al servidor).<br />001 = (NP_ACCESS_OUTBOUND) cauce de salida (del servidor al cliente). <br />010 = (NP_ACCESS_DUPLEX) cauce bidireccional (de cliente a servidor y viceversa). Cualquier otro valor no será válido.
|}
|-
| ulPipeMode
| Sus bits tienen los siguientes significados:
|-
|
||
{| BORDER="1"
|-
<TD>Reservado<U>Bit</TDU>
| <U>Descripción</U>
</TR>
|-
<TR>
| 31-16 || Reservado.
<TD>15</TD>
|-
<TD>Reservado. Tiene que ser 0.</TD>
| 15
</TR>
| Modo de bloqueo.<br />0 = (NP_WAIT) Modo ''blocking''. '''DosRead''' y '''DosWrite''' se congelan hasta que haya datos disponibles.<br />1 = (NP_NOWAIT) Modo ''nonblocking''. '''DosRead''' y '''DosWrite''' retornan inmediatamente si no hay datos disponibles.<br />'''DosRead''' retorna un error '''No hay datos'''; '''DosWrite''' retorna 0 como cantidad de datos escritos si no queda sitio en el buffer del cauce. En caso contrario, no devuelve error.
<TR>
|-
<TD>14</TD>
| 14-12 || Reservado.
<TD>Write-through. Tiene sentido en el caso de cauces remotos (en otro sistema conectado en red). Si es 0, los datos a enviar pueden ser almacenados en un buffer con el fin de enviarlos todos juntos. Si es 1, los datos serán enviados inmediatamente.</TD>
|-
| 11-10
| Tipo de cauce.<br />00 = (NP_TYPE_BYTE) El cauce está orientado a byte. Esto es, los datos son escritos como una ráfaga de bytes, y recuperados de igual forma.
<br />01 = (NP_TYPE_MESSAGE) El cauce está orientado a mensajes. Esto es, cada vez que se escribe algo, el sistema recuerda su longitud, y al recuperarlo devuelve exactamente el mismo número de bytes introducidos de cada vez. Esto lo almacena en los dos primeros bytes del mensaje (''cabecera del mensaje''). Una cabecera de ceros está reservada, y no se admiten mensajes de longitud cero.
</TR>
|-
<TR>
| 9-8
<TD>13-8</TD>
| Modo de lectura.<br />00 = (NP_READMODE_BYTE) Modo orientado a bytes. Lee el cauce como una ráfaga de bytes.<br />01 = (NP_READMODE_MESSAGE) Modo orientado a mensajes. Lee el cauce como un conjunto de mensajes.<br />Los cauces de mensaje pueden ser leidos tanto como mensajes como bytes; los cauces de bytes sólo pueden ser leidos como bytes.
<TD>Reservado</TD>
|-
</TR>
| 7-0
<TR>
| '''ICount''' (Instance Count). Cuando la primera instancia de una ''named pipe'' es creada, ICount especifica cuantas instancias serán creadas. El número de instancias determina cuantos clientes se pueden atender a la vez. Si se intentan definir más instancias de las posibles, se devuelve un error. Los posibles valores son:
<TD>7</TD>
<br />1 : Solo se admite una instancia (la actual).
<TD>Bit de herencia. Si es 0, el cauce pertenecerá también a los procesos hijos. Si es 1, será un cauce privado, y no será heredado por ningún hijo.</TD>
<br />1 < n < 255 : Se admiten n instancias.
<br />-1 : Se admiten ilimitadas instancias.
</TR>
<br />0 : reservado.
<TR>
|}
<TD>6-3</TD>
|-
<TD>Reservado. Tiene que valer 0.</TD>
| ulOutBufSize
</TR>
| Número de bytes que debe reservar OS/2 para el buffer de salida (servidor a cliente).
<TR>
|-
<TD>2-0</TD>
| ulInBufSize
<TD>Modo de acceso. Indica el sentido de los datos:<BR>000 = (NP_ACCESS_INBOUND) cauce de entrada (del cliente al servidor).<BR>001 = (NP_ACCESS_OUTBOUND) cauce de salida (del servidor al cliente). <BR>010 = (NP_ACCESS_DUPLEX) cauce bidireccional (de cliente a servidor y viceversa). Cualquier otro valor no será válido.</TD>
| Número de bytes que debe reservar OS/2 para el buffer de entrada (cliente a servidor).
|-
</TR>
| ulTimeOut
</TABLE>
| El valor por defecto para el ''TimeOut'' de '''DosWaitNPipe'''. Solo se tiene que especificar en la primera instancia. Si se especifica 0, se toma el valor por defecto de 50 milisegundos.
</TD></TR>
|}
<TR><TD>ulPipeMode</TD><TD>Sus bits tienen los siguientes significados:</TD></TR>
<P>
<TR><TD></TD><TD>
{|
<TABLE BORDER=1>
! <H3>Codigos de error</H3>
<TR>
|-
<TD><U>Bit</U></TD>
| 0 || Sin error
<TD><U>Descripción</U></TD>
|-
</TR>
| 3 || Path no encontrado
|-
<TR>
| 8 || No hay suficiente memoria
<TD>31-16</TD>
|-
<TD>Reservado.</TD>
| 84
</TR>
| Fuera de las estructuras (error interno)
<TR>
|-
<TD>15</TD>
| 87 || Parámetro no válido
<TD>Modo de bloqueo.<BR>0 = (NP_WAIT) Modo <I>blocking</I>. <B>DosRead</B> y <B>DosWrite</B> se congelan hasta que haya datos disponibles.<BR>1 = (NP_NOWAIT) Modo <I>nonblocking</I>. <B>DosRead</B> y <B>DosWrite</B> retornan inmediatamente si no hay datos disponibles.<BR><B>DosRead</B> retorna un error <B>No hay datos</B>; <B>DosWrite</B> retorna 0 como cantidad de datos escritos si no queda sitio en el buffer del cauce. En caso contrario, no devuelve error.</TD>
|-
| 231 || Cauce (''pipe'') ocupado.
</TR>
|}
<TR>
<TD>14-12</TD>
<TD>Reservado.</TD>
</TR>
<TR>
<TD>11-10</TD>
<TD>Tipo de cauce.<BR>00 = (NP_TYPE_BYTE) El cauce está orientado a byte. Esto es, los datos son escritos como una ráfaga de bytes, y recuperados de igual forma.
<BR>01 = (NP_TYPE_MESSAGE) El cauce está orientado a mensajes. Esto es, cada vez que se escribe algo, el sistema recuerda su longitud, y al recuperarlo devuelve exactamente el mismo número de bytes introducidos de cada vez. Esto lo almacena en los dos primeros bytes del mensaje (<I>cabecera del mensaje</I>). Una cabecera de ceros está reservada, y no se admiten mensajes de longitud cero.</TD>
</TR>
<TR>
<TD>9-8</TD>
<TD>Modo de lectura.<BR>00 = (NP_READMODE_BYTE) Modo orientado a bytes. Lee el cauce como una ráfaga de bytes.<BR>01 = (NP_READMODE_MESSAGE) Modo orientado a mensajes. Lee el cauce como un conjunto de mensajes.<BR>Los cauces de mensaje pueden ser leidos tanto como mensajes como bytes; los cauces de bytes sólo pueden ser leidos como bytes.</TD>
</TR>
<TR>
<TD>7-0</TD>
<TD><B>ICount</B> (Instance Count). Cuando la primera instancia de una <I>named pipe</I> es creada, ICount especifica cuantas instancias serán creadas. El número de instancias determina cuantos clientes se pueden atender a la vez. Si se intentan definir más instancias de las posibles, se devuelve un error. Los posibles valores son:
<BR>1 : Solo se admite una instancia (la actual).
<BR>1 < n < 255 : Se admiten n instancias.
<BR>-1 : Se admiten ilimitadas instancias.
<BR>0 : reservado.</TD>
</TR>
</TABLE>
</TD></TR>
<TR><TD>ulOutBufSize</TD><TD>Número de bytes que debe reservar OS/2 para el buffer de salida (servidor a cliente).</TD></TR>
<TR><TD>ulInBufSize</TD><TD>Número de bytes que debe reservar OS/2 para el buffer de entrada (cliente a servidor).</TD></TR>
<TR><TD>ulTimeOut</TD><TD>El valor por defecto para el <I>TimeOut</I> de <B>DosWaitNPipe</B>. Solo se tiene que especificar en la primera instancia. Si se especifica 0, se toma el valor por defecto de 50 milisegundos.</TD></TR>
</TABLE>
<P><TABLE><TH><H3>Codigos de error</H3></TH>
<TR><TD>0</TD><TD>Sin error</TD></TR>
<TR><TD>3</TD><TD>Path no encontrado</TD></TR>
<TR><TD>8</TD><TD>No hay suficiente memoria</TD></TR>
<TR><TD>84</TD><TD>Fuera de las estructuras (error interno)</TD></TR>
<TR><TD>87</TD><TD>Parámetro no válido</TD></TR>
<TR><TD>231</TD><TD>Cauce (<I>pipe</I>) ocupado.</TD></TR>
</TABLE>
<P>
<P><A NAME="DOSCREATEPIPE"><CENTER><H1><HR>DosCreatePipe<HR></H1></CENTER>
</A>
<P>DosCreatePipe crea un cauce <I>''sin nombre</I>'' (unnamed pipe).
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>PHFILE pshfReadHandle;
<BRbr />PHFILE pshfWriteHandle;
<BRbr />ULONG ulPipeSize;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosCreatePipe(pshfReadHandle, pshfWriteHandle, ulPipeSize);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>pshfReadHandle</TD><TD>Un puntero a una doble palabra donde OS/2 devolverá el handle de lectura para el cauce. Este handle deberá ser usado por el proceso que quiera leer del cauce.</TD></TR>
! <H3>Parámetros</H3>
<TR><TD>pshfWriteHandle</TD><TD>Un puntero a una doble palabra donde OS/2 devolverá el handle de escritura para el cauce. Este handle deberá ser usado por el proceso que quiera escribir en el cauce.</TD></TR>
|-
| pshfReadHandle
<TR><TD>ulPipeSize</TD><TD>El tamaño en bytes del buffer del cauce.</TD></TR>
| Un puntero a una doble palabra donde OS/2 devolverá el handle de lectura para el cauce. Este handle deberá ser usado por el proceso que quiera leer del cauce.
</TABLE>
|-
<P><TABLE><TH><H3>Codigos de error</H3></TH>
| pshfWriteHandle
<TR><TD>0</TD><TD>Sin error</TD></TR>
| Un puntero a una doble palabra donde OS/2 devolverá el handle de escritura para el cauce. Este handle deberá ser usado por el proceso que quiera escribir en el cauce.
<TR><TD>8</TD><TD>No hay suficiente memoria</TD></TR>
|-
</TABLE>
| ulPipeSize
| El tamaño en bytes del buffer del cauce.
|}
<P>
{|
! <H3>Codigos de error</H3>
|-
| 0 || Sin error
|-
| 8 || No hay suficiente memoria
|}
<P>
<P><A NAME="DOSDISCONNECTNPIPE"><CENTER><H1><HR>DosDisConnectNPipe<HR></H1></CENTER>
</A>
<P>DosDisConnectNPipe sirve de <I>''acuse de recibo</I>'' para un proceso que ha cerrado un <I>''named pipe</I>''. Mientras el servidor no ejecute esta llamada (sobre un cauce cerrado por un cliente) recibirá un valor de cero en <I>''BytesRead</I>'' si intenta leer, o un error <B>'''BROKEN_PIPE</B>''' (<I>''el cauce está cerrado</I>'', error 109) si intenta escribir. El cauce no puede ser usado por otro cliente hasta que el servidor ejecute <B>'''DosConnectNPipe</B>'''. <B>'''DosDisConnectNPipe</B>''' también libera todos los threads bloqueados en un <B>'''DosRead</B>'''.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>HPIPE hpipeHandle;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosDisConnectNPipe(hpipeHandle);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>Handle de un <I>named pipe</I> a desconectar.</TD></TR>
! <H3>Parámetros</H3>
</TABLE>
|-
| hpipeHandle
| Handle de un ''named pipe'' a desconectar.
|}
<P>
<P><TABLE><TH><H3>Codigos de error</H3></TH>
{|
<TR><TD>0</TD><TD>Sin error</TD></TR>
! <H3>Codigos de error</H3>
<TR><TD>109</TD><TD>El cauce (<I>pipe</I>) está cerrado</TD></TR>
|-
<TR><TD>230</TD><TD>Cauce incorrecto</TD></TR>
| 0 || Sin error
</TABLE>
|-
| 109
| El cauce (''pipe'') está cerrado
|-
| 230 || Cauce incorrecto
|}
<P>
<P><A NAME="DOSDUPHANDLE"><CENTER><H1><HR>DosDupHandle<HR></H1></CENTER>
</A>
<P>DosDupHandle obtiene un nuevo handle para un fichero ya abierto, de modo que se puede usar cualquiera de los dos para referirse a él. El uso de <B>'''DosClose</B>''' sobre un handle no afectará al handle duplicado.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>HFILE OldFileHandle;
<BRbr />PHFILE pshfNewFileHandle;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosDupHandle(OldFileHandle, pshfNewFileHandle);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>OldFileHandle</TD><TD>Handle del fichero o cauce a duplicar.</TD></TR>
! <H3>Parámetros</H3>
<TR><TD>pshfNewFileHandle</TD><TD>Puntero a una doble palabra. Si al hacer la llamada contiene 0xFFFFFFFF, OS/2 devolverá el primer valor libre que haya. Si contiene un valor distinto, asociará el fichero con ese número. Por ejemplo, si como valor introducimos 0, OS/2 asociará la entrada estandar del sistema al fichero/cauce indicado en <B>OldFileHandle</B>; si vale 1, OS/2 asociará la salida estandar del sistema, y si vale 2, OS/2 asociará la salida de error estandar. Si el nuevo handle indicado es igual al de algún fichero abierto, OS/2 lo cerrará primero.</TD></TR>
|-
| OldFileHandle
</TABLE>
| Handle del fichero o cauce a duplicar.
<P><TABLE><TH><H3>Codigos de error</H3></TH>
|-
<TR><TD>0</TD><TD>Sin error</TD></TR>
| pshfNewFileHandle
<TR><TD>4</TD><TD>Demasiados archivos abiertos</TD></TR>
| Puntero a una doble palabra. Si al hacer la llamada contiene 0xFFFFFFFF, OS/2 devolverá el primer valor libre que haya. Si contiene un valor distinto, asociará el fichero con ese número. Por ejemplo, si como valor introducimos 0, OS/2 asociará la entrada estandar del sistema al fichero/cauce indicado en '''OldFileHandle'''; si vale 1, OS/2 asociará la salida estandar del sistema, y si vale 2, OS/2 asociará la salida de error estandar. Si el nuevo handle indicado es igual al de algún fichero abierto, OS/2 lo cerrará primero.
<TR><TD>6</TD><TD>HANDLE no válido</TD></TR>
|}
<TR><TD>114</TD><TD>El handle de destino no es válido</TD></TR>
<P>
{|
</TABLE>
! <H3>Codigos de error</H3>
|-
| 0 || Sin error
|-
| 4 || Demasiados archivos abiertos
|-
| 6 || HANDLE no válido
|-
| 114
| El handle de destino no es válido
|}
<P>
<P><A NAME="DOSPEEKNPIPE"><CENTER><H1><HR>DosPeekNPipe<HR></H1></CENTER>
</A>
<P>DosPeekNPipe permite examinar el dato en un <I>''named pipe</I>'' sin eliminarlo. También devuelve información sobre el estado del cauce. Esta función nunca se bloquea; siempre retorna inmediatamente. El valor del estado puede ser usado por el cliente o el servidor para tomar la acción adecuada.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>HPIPE hpipeHandle;
<BRbr />PVOID pBuffer;
<BRbr />ULONG ulBufferLen;
<BRbr />PULONG pBytesRead;
<BRbr />PAVAILDATA pBytesAvail;
<BRbr />PULONG pPipeState;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosPeekNPipe(hpipeHandle, pBuffer, ulBufferLen, pBytesRead, pBytesAvail, pPipeState);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>Handle del <I>named pipe</I> a examinar. <B>DosCreateNPipe</B> devuelve el handle del servidor; <B>DosOpen</B> devuelve el handle del cliente.</TD></TR>
! <H3>Parámetros</H3>
|-
| hpipeHandle
| Handle del ''named pipe'' a examinar. '''DosCreateNPipe''' devuelve el handle del servidor; '''DosOpen''' devuelve el handle del cliente.
|-
| pBuffer || Un puntero al buffer de salida.
|-
| ulBufferLen
| Número de bytes a leer del cauce.
|-
| pBytesRead
| Un puntero a una posición de memoria donde OS/2 devolverá el número de bytes leidos.
|-
| pBytesAvail
| Un puntero a una zona de memoria de 4 bytes donde OS/2 devolverá el número de bytes que están disponibles en el cauce. La estructura del buffer es:
|-
|
||
{| BORDER="1"
|-
<TD><U>Bit</U>
<TR><TD>pBuffer</TD><TD>Un puntero al buffer de salida.</TD></TR>
| <U>Descripción</U>
<TR><TD>ulBufferLen</TD><TD>Número de bytes a leer del cauce.</TD></TR>
|-
<TR><TD>pBytesRead</TD><TD>Un puntero a una posición de memoria donde OS/2 devolverá el número de bytes leidos.</TD></TR>
| 32-16
<TR><TD>pBytesAvail</TD><TD>Un puntero a una zona de memoria de 4 bytes donde OS/2 devolverá el número de bytes que están disponibles en el cauce. La estructura del buffer es:</TD></TR>
| Número de bytes que contiene el buffer del cauce (incluyendo bytes de cabecera y bytes que ya han sido examinados).
|-
| 15-0
| Número de bytes que componen el mensaje actual (0 para un cauce orientado a byte).
|}
|-
| pPipeState
| Un puntero a una posición de memoria donde OS/2 devolverá el estado del cauce
|-
|
||
{| BORDER="1"
|-
<TRTD><TDU>Valor</TD><TDU>
| <U>Significado</U>
<TABLE BORDER=1>
|-
| 1
| (NP_STATE_DISCONNECTED) Desconectado
|-
| 2 || (NP_STATE_LISTENING) En escucha
|-
| 3 || (NP_STATE_CONNECTED) Conectado
|-
| 4
| (NP_STATE_CLOSING) Cerrándose
|}
<br />El cauce está ''desconectado'' inmediatamente después de una llamada a '''DosCreateNPipe''' o a '''DosDisConnectNPipe'''.
<br />El cauce está ''en escucha'' después de que el servidor ejecute '''DosConnectNPipe'''.
<TR>
<br />El cauce está ''conectado'' después de que un cliente haya ejecutado con éxito '''DosOpen'''.
<TD><U>Bit</U></TD>
<TD><U>Descripción</U></TD>
</TR>
<TR>
<TD>32-16</TD>
<TD>Número de bytes que contiene el buffer del cauce (incluyendo bytes de cabecera y bytes que ya han sido examinados).</TD>
<br />El cauce está ''cerrándose'' después de que un cliente haya ejecutado '''DosClose''' al handle del cauce y a todos sus duplicados.
</TR>
|}
<TR>
<P>
<TD>15-0</TD>
{|
<TD>Número de bytes que componen el mensaje actual (0 para un cauce orientado a byte).</TD>
! <H3>Codigos de error</H3>
</TR>
|-
</TABLE>
| 0 || Sin error
</TD></TR>
|-
<TR><TD>pPipeState</TD><TD>Un puntero a una posición de memoria donde OS/2 devolverá el estado del cauce</TD></TR>
| 230 || Cauce incorrecto
|-
<TR><TD></TD><TD>
| 231 || Cauce (''pipe'') ocupado.
<TABLE BORDER=1>
|-
| 233 || Cauce no abierto
<TR>
|}
<TD><U>Valor</U></TD>
<TD><U>Significado</U></TD>
</TR>
<TR>
<TD>1</TD>
<TD>(NP_STATE_DISCONNECTED) Desconectado</TD>
</TR>
<TR>
<TD>2</TD>
<TD>(NP_STATE_LISTENING) En escucha</TD>
</TR>
<TR>
<TD>3</TD>
<TD>(NP_STATE_CONNECTED) Conectado</TD>
</TR>
<TR>
<TD>4</TD>
<TD>(NP_STATE_CLOSING) Cerrándose</TD>
</TR>
</TABLE>
<BR>El cauce está <I>desconectado</I> inmediatamente después de una llamada a <B>DosCreateNPipe</B> o a <B>DosDisConnectNPipe</B>.
<BR>El cauce está <I>en escucha</I> después de que el servidor ejecute <B>DosConnectNPipe</B>.
<BR>El cauce está <I>conectado</I> después de que un cliente haya ejecutado con éxito <B>DosOpen</B>.
<BR>El cauce está <I>cerrándose</I> después de que un cliente haya ejecutado <B>DosClose</B> al handle del cauce y a todos sus duplicados.
</TD></TR>
</TABLE>
<P><TABLE><TH><H3>Codigos de error</H3></TH>
<TR><TD>0</TD><TD>Sin error</TD></TR>
<TR><TD>230</TD><TD>Cauce incorrecto</TD></TR>
<TR><TD>231</TD><TD>Cauce (<I>pipe</I>) ocupado.</TD></TR>
<TR><TD>233</TD><TD>Cauce no abierto</TD></TR>
</TABLE>
<P>
<P><A NAME="DOSQUERYNPHSTATE"><CENTER><H1><HR>DosQueryNPHState<HR></H1></CENTER>
</A>
<P>DosQueryNPHState devuelve información sobre un <I>''named pipe</I>''.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>HPIPE hpipeHandle;
<BRbr />PULONG pPipeHandleState;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosQueryNPHState(hpipeHandle, pPipeHandleState);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>El handle del <I>named pipe</I> a comprobar.</TD></TR>
! <H3>Parámetros</H3>
|-
| hpipeHandle
| El handle del ''named pipe'' a comprobar.
|-
| pPipeHandleState
| Un puntero a una posición de memoria donde OS/2 devolverá el estado del cauce.
|-
|
||
{| BORDER="1"
|-
<TD><U>Bit</U>
<TR><TD>pPipeHandleState</TD><TD>Un puntero a una posición de memoria donde OS/2 devolverá el estado del cauce.</TD></TR>
| <U>Descripción</U>
<TR><TD></TD><TD>
|-
<TABLE BORDER=1>
| 31-16 || Reservado.
<TR>
|-
<TD><U>Bit</U></TD>
| 15
<TD><U>Descripción</U></TD>
| Modo de bloqueo.<br />0 = (NP_WAIT) Modo ''blocking''. '''DosRead''' y '''DosWrite''' se congelan hasta que haya datos disponibles.<br />1 = (NP_NOWAIT) Modo ''nonblocking''. '''DosRead''' y '''DosWrite''' retornan inmediatamente si no hay datos disponibles.<br />'''DosRead''' retorna un error '''No hay datos'''; '''DosWrite''' retorna 0 como cantidad de datos escritos si no queda sitio en el buffer del cauce. En caso contrario, no devuelve error.
</TR>
|-
| 14
<TR>
| Si es 0 (NP_END_CLIENT) el handle es para el cliente del cauce.
<TD>31-16</TD>
<br />Si es 1 (NP_END_SERVER) el handle es para el servidor del cauce.
<TD>Reservado.</TD>
|-
</TR>
| 13-12 || Reservado.
<TR>
|-
<TD>15</TD>
| 11-10
<TD>Modo de bloqueo.<BR>0 = (NP_WAIT) Modo <I>blocking</I>. <B>DosRead</B> y <B>DosWrite</B> se congelan hasta que haya datos disponibles.<BR>1 = (NP_NOWAIT) Modo <I>nonblocking</I>. <B>DosRead</B> y <B>DosWrite</B> retornan inmediatamente si no hay datos disponibles.<BR><B>DosRead</B> retorna un error <B>No hay datos</B>; <B>DosWrite</B> retorna 0 como cantidad de datos escritos si no queda sitio en el buffer del cauce. En caso contrario, no devuelve error.</TD>
| Tipo de cauce.<br />00 = (NP_TYPE_BYTE) El cauce está orientado a byte. Esto es, los datos son escritos como una ráfaga de bytes, y recuperados de igual forma.
<br />01 = (NP_TYPE_MESSAGE) El cauce está orientado a mensajes. Esto es, cada vez que se escribe algo, el sistema recuerda su longitud, y al recuperarlo devuelve exactamente el mismo número de bytes introducidos de cada vez. Esto lo almacena en los dos primeros bytes del mensaje (''cabecera del mensaje''). Una cabecera de ceros está reservada, y no se admiten mensajes de longitud cero.
</TR>
|-
<TR>
| 9-8
<TD>14</TD>
| Modo de lectura.<br />00 = (NP_READMODE_BYTE) Modo orientado a bytes. Lee el cauce como una ráfaga de bytes.<br />01 = (NP_READMODE_MESSAGE) Modo orientado a mensajes. Lee el cauce como un conjunto de mensajes.<br />Los cauces de mensaje pueden ser leidos tanto como mensajes como bytes; los cauces de bytes sólo pueden ser leidos como bytes.
<TD>Si es 0 (NP_END_CLIENT) el handle es para el cliente del cauce.
|-
<BR>Si es 1 (NP_END_SERVER) el handle es para el servidor del cauce.</TD>
| 7-0
</TR>
| '''ICount''' (Instance Count). Número de instancias. Determina cuantos clientes se pueden atender a la vez. Los posibles valores son:
<TR>
<br />1 : Solo se admite una instancia (la actual).
<TD>13-12</TD>
<br />1 < n < 255 : Se admiten n instancias.
<TD>Reservado.</TD>
<br />-1 : Se admiten ilimitadas instancias.
<br />0 : reservado.
</TR>
|}
<TR>
|}
<TD>11-10</TD>
<P>
<TD>Tipo de cauce.<BR>00 = (NP_TYPE_BYTE) El cauce está orientado a byte. Esto es, los datos son escritos como una ráfaga de bytes, y recuperados de igual forma.
{|
<BR>01 = (NP_TYPE_MESSAGE) El cauce está orientado a mensajes. Esto es, cada vez que se escribe algo, el sistema recuerda su longitud, y al recuperarlo devuelve exactamente el mismo número de bytes introducidos de cada vez. Esto lo almacena en los dos primeros bytes del mensaje (<I>cabecera del mensaje</I>). Una cabecera de ceros está reservada, y no se admiten mensajes de longitud cero.</TD>
! <H3>Codigos de error</H3>
|-
</TR>
| 0 || Sin error
<TR>
|-
<TD>9-8</TD>
| 230 || Cauce incorrecto
<TD>Modo de lectura.<BR>00 = (NP_READMODE_BYTE) Modo orientado a bytes. Lee el cauce como una ráfaga de bytes.<BR>01 = (NP_READMODE_MESSAGE) Modo orientado a mensajes. Lee el cauce como un conjunto de mensajes.<BR>Los cauces de mensaje pueden ser leidos tanto como mensajes como bytes; los cauces de bytes sólo pueden ser leidos como bytes.</TD>
|-
</TR>
| 233 || Cauce no abierto
<TR>
|}
<TD>7-0</TD>
<TD><B>ICount</B> (Instance Count). Número de instancias. Determina cuantos clientes se pueden atender a la vez. Los posibles valores son:
<BR>1 : Solo se admite una instancia (la actual).
<BR>1 < n < 255 : Se admiten n instancias.
<BR>-1 : Se admiten ilimitadas instancias.
<BR>0 : reservado.</TD>
</TR>
</TABLE>
</TD></TR>
</TABLE>
<P><TABLE><TH><H3>Codigos de error</H3></TH>
<TR><TD>0</TD><TD>Sin error</TD></TR>
<TR><TD>230</TD><TD>Cauce incorrecto</TD></TR>
<TR><TD>233</TD><TD>Cauce no abierto</TD></TR>
</TABLE>
<P>
<P><A NAME="DOSSETNPHSTATE"><CENTER><H1><HR>DosSetNPHState<HR></H1></CENTER>
</A>
<P>DosSetNPHState permite cambiar el modo de bloqueo y de lectura de un <I>''named pipe</I>''.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>HPIPE hpipeHandle;
<BRbr />ULONG ulPipeHandleState;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosSetNPHState(hpipeHandle, ulPipeHandleState);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>El handle del cauce a cambiar de estado.</TD></TR>
! <H3>Parámetros</H3>
|-
| hpipeHandle
| El handle del cauce a cambiar de estado.
|-
| ulPipeHandle
| Un campo de bits con los siguientes significados:
|-
|
||
{| BORDER="1"
|-
<TD><U>Bit</U>
<TR><TD>ulPipeHandle</TD><TD>Un campo de bits con los siguientes significados:</TD></TR>
| <U>Descripción</U>
<TR><TD></TD><TD>
|-
<TABLE BORDER=1>
| 31-16 || Reservado.
<TR>
|-
<TD><U>Bit</U></TD>
| 15
<TD><U>Descripción</U></TD>
| Modo de bloqueo.<br />0 = (NP_WAIT) Modo ''blocking''. '''DosRead''' y '''DosWrite''' se congelan hasta que haya datos disponibles.<br />1 = (NP_NOWAIT) Modo ''nonblocking''. '''DosRead''' y '''DosWrite''' retornan inmediatamente si no hay datos disponibles.<br />'''DosRead''' retorna un error '''No hay datos'''; '''DosWrite''' retorna 0 como cantidad de datos escritos si no queda sitio en el buffer del cauce. En caso contrario, no devuelve error.
</TR>
|-
<TR>
| 14-10 || Reservado.
<TD>31-16</TD>
|-
| 9-8
<TD>Reservado.</TD>
| Modo de lectura.<br />00 = (NP_READMODE_BYTE) Modo orientado a bytes. Lee el cauce como una ráfaga de bytes.<br />01 = (NP_READMODE_MESSAGE) Modo orientado a mensajes. Lee el cauce como un conjunto de mensajes.<br />Los cauces de mensaje pueden ser leidos tanto como mensajes como bytes; los cauces de bytes sólo pueden ser leidos como bytes.
</TR>
|-
<TR>
| 7-0 || Reservado. Debe ser 0.
<TD>15</TD>
|}
<TD>Modo de bloqueo.<BR>0 = (NP_WAIT) Modo <I>blocking</I>. <B>DosRead</B> y <B>DosWrite</B> se congelan hasta que haya datos disponibles.<BR>1 = (NP_NOWAIT) Modo <I>nonblocking</I>. <B>DosRead</B> y <B>DosWrite</B> retornan inmediatamente si no hay datos disponibles.<BR><B>DosRead</B> retorna un error <B>No hay datos</B>; <B>DosWrite</B> retorna 0 como cantidad de datos escritos si no queda sitio en el buffer del cauce. En caso contrario, no devuelve error.</TD>
|}
</TRP>
{|
<TR>
! <H3>Codigos de error</H3>
<TD>14-10</TD>
|-
<TD>Reservado.</TD>
| 0 || Sin error
</TR>
|-
<TR>
| 87 || Parámetro no válido
<TD>9-8</TD>
|-
<TD>Modo de lectura.<BR>00 = (NP_READMODE_BYTE) Modo orientado a bytes. Lee el cauce como una ráfaga de bytes.<BR>01 = (NP_READMODE_MESSAGE) Modo orientado a mensajes. Lee el cauce como un conjunto de mensajes.<BR>Los cauces de mensaje pueden ser leidos tanto como mensajes como bytes; los cauces de bytes sólo pueden ser leidos como bytes.</TD>
| 230 || Cauce incorrecto
|-
</TR>
| 231 || Cauce (''pipe'') ocupado.
<TR>
|-
<TD>7-0</TD>
| 233 || Cauce no abierto
<TD>Reservado. Debe ser 0.</TD>
|}
</TR>
</TABLE></TD></TR>
</TABLE>
<P><TABLE><TH><H3>Codigos de error</H3></TH>
<TR><TD>0</TD><TD>Sin error</TD></TR>
<TR><TD>87</TD><TD>Parámetro no válido</TD></TR>
<TR><TD>230</TD><TD>Cauce incorrecto</TD></TR>
<TR><TD>231</TD><TD>Cauce (<I>pipe</I>) ocupado.</TD></TR>
<TR><TD>233</TD><TD>Cauce no abierto</TD></TR>
</TABLE>
<P>
<P><A NAME="DOSSETNPIPESEM"><CENTER><H1><HR>DosSetNPipeSem<HR></H1></CENTER>
</A>
<P>DosSetNPipeSem asocia a un <I>''named pipe</I>'' un semáforo de evento compartido. Solo funciona con cauces locales. Si se intenta hacer con un cauce remoto (situado en otra máquina de la red) dará un error <B>'''Función no válida</B>'''. Si ya había un semáforo asociado al cauce, <B>'''DosSetNPipeSem</B>''' lo reemplaza con el nuevo semáforo.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>HPIPE hpipeHandle;
<BRbr />HSEM hsemSemHandle;
<BRbr />ULONG ulKeyHandle;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosSetNPipeSem(hpipeHandle, hsemSemHandle, ulKeyHandle);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>El handle del cauce al que se le quiere asociar el semáforo de evento.</TD></TR>
! <H3>Parámetros</H3>
<TR><TD>hsemSemHandle</TD><TD>El handle de un semafor de evento que es activado (<I>posted</I>) cuando el cauce tiene datos disponibles para leer o bien espacio disponible para escribir.</TD></TR>
|-
| hpipeHandle
<TR><TD>ulKeyHandle</TD><TD>Un valor que permite distinguir eventos provenientes de cauces distintos asociados al mismo semáforo.</TD></TR>
| El handle del cauce al que se le quiere asociar el semáforo de evento.
</TABLE>
|-
<P><TABLE><TH><H3>Codigos de error</H3></TH>
| hsemSemHandle
<TR><TD>0</TD><TD>Sin error</TD></TR>
| El handle de un semafor de evento que es activado (''posted'') cuando el cauce tiene datos disponibles para leer o bien espacio disponible para escribir.
<TR><TD>1</TD><TD>Función no válida</TD></TR>
|-
<TR><TD>6</TD><TD>HANDLE no válido</TD></TR>
| ulKeyHandle
| Un valor que permite distinguir eventos provenientes de cauces distintos asociados al mismo semáforo.
<TR><TD>87</TD><TD>Parámetro no válido</TD></TR>
|}
<TR><TD>230</TD><TD>Cauce incorrecto</TD></TR>
<P>
<TR><TD>233</TD><TD>Cauce no abierto</TD></TR>
{|
</TABLE>
! <H3>Codigos de error</H3>
|-
| 0 || Sin error
|-
| 1 || Función no válida
|-
| 6 || HANDLE no válido
|-
| 87 || Parámetro no válido
|-
| 230 || Cauce incorrecto
|-
| 233 || Cauce no abierto
|}
<P>
<P><A NAME="DOSWAITNPIPE"><CENTER><H1><HR>DosWaitNPipe<HR></H1></CENTER>
</A>
<P>DosWaitNPipe espera a que haya disponible una instancia de un <I>''named pipe</I>''. Este caso se da cuando todas las posibles instancias de un cauce están ocupadas por procesos cliente. Solo se puede usar cuando <B>'''DosOpen</B>''' ha devuelto el error <B>'''Cauce ocupado</B>'''. Si <B>'''DosWaitNPipe</B>''' no devuelve error, el cliente debe repetir la llamada <B>'''DosOpen</B>''' para abrir el cauce. Si hay varios procesos esperando por una instancia libre de un mismo cauce, OS/2 se lo cederá primero al que tenga mayor prioridad; si dos tienen la misma prioridad, recibirá la instancia el que lleve más tiempo esperando.
<P>#define INCL_BASE<BRbr />#include <os2.h>
<P>PSZ pszFileName;
<BRbr />ULONG ulTimeOut;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosWaitNPipe(pszFileName, ulTimeOut);
<P>
<P><TABLE><TH><H3>Parámetros</H3></TH>
{|
<TR><TD>pszFileName</TD><TD>Puntero a una cadena ASCIIZ con el nombre del cauce a abrir.</TD></TR>
! <H3>Parámetros</H3>
<TR><TD>ulTimeOut</TD><TD>El tiempo máximo, en milisegundos, que se esperará para que se libere una instancia del cauce. Cuando se indica un tiempo de 0, se usa el valor <B>TimeOut</B> definido en <B>DosCreateNPipe</B>. Cuando se indica un valor de -1, se espera un tiempo indefinido.</TD></TR>
|-
| pszFileName
</TABLE>
| Puntero a una cadena ASCIIZ con el nombre del cauce a abrir.
<P><TABLE><TH><H3>Codigos de error</H3></TH>
|-
<TR><TD>0</TD><TD>Sin error</TD></TR>
| ulTimeOut
<TR><TD>2</TD><TD>Fichero no encontrado</TD></TR>
| El tiempo máximo, en milisegundos, que se esperará para que se libere una instancia del cauce. Cuando se indica un tiempo de 0, se usa el valor '''TimeOut''' definido en '''DosCreateNPipe'''. Cuando se indica un valor de -1, se espera un tiempo indefinido.
<TR><TD>95</TD><TD>Interrupción</TD></TR>
|}
<TR><TD>231</TD><TD>Cauce (<I>pipe</I>) ocupado.</TD></TR>
<P>
{|
</TABLE>
! <H3>Codigos de error</H3>
|-
| 0 || Sin error
|-
| 2 || Fichero no encontrado
|-
| 95 || Interrupción
|-
| 231 || Cauce (''pipe'') ocupado.
|}
|