Diferencia entre revisiones de «Manual de programación de OS/2/Llamadas DOSxxx para cauces (pipes)»

Contenido eliminado Contenido añadido
Sin resumen de edición
m Bot controlado: actualizada sintaxis de tabla; cambios triviales
 
Línea 1:
<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&iacute;, 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&aacute; 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 &lt;os2.h&gt;
<P>HPIPE hpipeHandle;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosConnectNPipe(hpipeHandle);
<P>
<P><TABLE><TH><H3>Par&aacute;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&aacute;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&oacute;n</TD></TR>
<P>
<TR><TD>109</TD><TD>El cauce (<I>pipe</I>) est&aacute; 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&oacute;n
|-
| 109
| El cauce (''pipe'') est&aacute; 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 &lt;os2.h&gt;
 
<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&aacute;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&aacute;metros</H3>
<TR><TD>phpipePipeHandle</TD><TD>Un puntero a una zona de memoria donde OS/2 devolver&aacute; 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&aacute; 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&oacute;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&oacute;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&aacute;n enviados inmediatamente.
<TD>31-16</TD>
|-
| 13-8 || Reservado
|-
| 7
| Bit de herencia. Si es 0, el cauce pertenecer&aacute; tambi&eacute;n a los procesos hijos. Si es 1, ser&aacute; un cauce privado, y no ser&aacute; heredado por ning&uacute;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&aacute; v&aacute;lido.
|}
|-
| ulPipeMode
| Sus bits tienen los siguientes significados:
|-
|
||
{| BORDER="1"
|-
 
<TD>Reservado<U>Bit</TDU>
| <U>Descripci&oacute;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&aacute;n enviados inmediatamente.</TD>
|-
| 11-10
| Tipo de cauce.<br />00 = (NP_TYPE_BYTE) El cauce est&aacute; orientado a byte. Esto es, los datos son escritos como una r&aacute;faga de bytes, y recuperados de igual forma.
 
<br />01 = (NP_TYPE_MESSAGE) El cauce est&aacute; orientado a mensajes. Esto es, cada vez que se escribe algo, el sistema recuerda su longitud, y al recuperarlo devuelve exactamente el mismo n&uacute;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&aacute; 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&aacute;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&oacute;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&aacute;n creadas. El n&uacute;mero de instancias determina cuantos clientes se pueden atender a la vez. Si se intentan definir m&aacute;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&aacute; tambi&eacute;n a los procesos hijos. Si es 1, ser&aacute; un cauce privado, y no ser&aacute; heredado por ning&uacute;n hijo.</TD>
<br />1 &lt; n &lt; 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&uacute;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&aacute; v&aacute;lido.</TD>
| N&uacute;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&oacute;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&aacute;metro no v&aacute;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&aacute; orientado a byte. Esto es, los datos son escritos como una r&aacute;faga de bytes, y recuperados de igual forma.
 
<BR>01 = (NP_TYPE_MESSAGE) El cauce est&aacute; orientado a mensajes. Esto es, cada vez que se escribe algo, el sistema recuerda su longitud, y al recuperarlo devuelve exactamente el mismo n&uacute;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&aacute; 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&aacute;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&oacute;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&aacute;n creadas. El n&uacute;mero de instancias determina cuantos clientes se pueden atender a la vez. Si se intentan definir m&aacute;s instancias de las posibles, se devuelve un error. Los posibles valores son:
<BR>1 : Solo se admite una instancia (la actual).
<BR>1 &lt; n &lt; 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&uacute;mero de bytes que debe reservar OS/2 para el buffer de salida (servidor a cliente).</TD></TR>
<TR><TD>ulInBufSize</TD><TD>N&uacute;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&aacute;metro no v&aacute;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 &lt;os2.h&gt;
 
<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&aacute;metros</H3></TH>
{|
<TR><TD>pshfReadHandle</TD><TD>Un puntero a una doble palabra donde OS/2 devolver&aacute; el handle de lectura para el cauce. Este handle deber&aacute; ser usado por el proceso que quiera leer del cauce.</TD></TR>
! <H3>Par&aacute;metros</H3>
<TR><TD>pshfWriteHandle</TD><TD>Un puntero a una doble palabra donde OS/2 devolver&aacute; el handle de escritura para el cauce. Este handle deber&aacute; ser usado por el proceso que quiera escribir en el cauce.</TD></TR>
|-
 
| pshfReadHandle
<TR><TD>ulPipeSize</TD><TD>El tama&ntilde;o en bytes del buffer del cauce.</TD></TR>
| Un puntero a una doble palabra donde OS/2 devolver&aacute; el handle de lectura para el cauce. Este handle deber&aacute; 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&aacute; el handle de escritura para el cauce. Este handle deber&aacute; 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&ntilde;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&aacute; un valor de cero en <I>''BytesRead</I>'' si intenta leer, o un error <B>'''BROKEN_PIPE</B>''' (<I>''el cauce est&aacute; 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&eacute;n libera todos los threads bloqueados en un <B>'''DosRead</B>'''.
 
<P>#define INCL_BASE<BRbr />#include &lt;os2.h&gt;
<P>HPIPE hpipeHandle;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosDisConnectNPipe(hpipeHandle);
<P>
<P><TABLE><TH><H3>Par&aacute;metros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>Handle de un <I>named pipe</I> a desconectar.</TD></TR>
! <H3>Par&aacute;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&aacute; cerrado</TD></TR>
|-
<TR><TD>230</TD><TD>Cauce incorrecto</TD></TR>
| 0 || Sin error
</TABLE>
|-
| 109
| El cauce (''pipe'') est&aacute; 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 &eacute;l. El uso de <B>'''DosClose</B>''' sobre un handle no afectar&aacute; al handle duplicado.
<P>#define INCL_BASE<BRbr />#include &lt;os2.h&gt;
<P>HFILE OldFileHandle;
<BRbr />PHFILE pshfNewFileHandle;
<BRbr />APIRET rc; /* Codigo de error */
 
<P>rc = DosDupHandle(OldFileHandle, pshfNewFileHandle);
<P>
<P><TABLE><TH><H3>Par&aacute;metros</H3></TH>
{|
<TR><TD>OldFileHandle</TD><TD>Handle del fichero o cauce a duplicar.</TD></TR>
! <H3>Par&aacute;metros</H3>
<TR><TD>pshfNewFileHandle</TD><TD>Puntero a una doble palabra. Si al hacer la llamada contiene 0xFFFFFFFF, OS/2 devolver&aacute; el primer valor libre que haya. Si contiene un valor distinto, asociar&aacute; el fichero con ese n&uacute;mero. Por ejemplo, si como valor introducimos 0, OS/2 asociar&aacute; la entrada estandar del sistema al fichero/cauce indicado en <B>OldFileHandle</B>; si vale 1, OS/2 asociar&aacute; la salida estandar del sistema, y si vale 2, OS/2 asociar&aacute; la salida de error estandar. Si el nuevo handle indicado es igual al de alg&uacute;n fichero abierto, OS/2 lo cerrar&aacute; 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&aacute; el primer valor libre que haya. Si contiene un valor distinto, asociar&aacute; el fichero con ese n&uacute;mero. Por ejemplo, si como valor introducimos 0, OS/2 asociar&aacute; la entrada estandar del sistema al fichero/cauce indicado en '''OldFileHandle'''; si vale 1, OS/2 asociar&aacute; la salida estandar del sistema, y si vale 2, OS/2 asociar&aacute; la salida de error estandar. Si el nuevo handle indicado es igual al de alg&uacute;n fichero abierto, OS/2 lo cerrar&aacute; primero.
<TR><TD>6</TD><TD>HANDLE no v&aacute;lido</TD></TR>
|}
<TR><TD>114</TD><TD>El handle de destino no es v&aacute;lido</TD></TR>
<P>
 
{|
</TABLE>
! <H3>Codigos de error</H3>
|-
| 0 || Sin error
|-
| 4 || Demasiados archivos abiertos
|-
| 6 || HANDLE no v&aacute;lido
|-
| 114
| El handle de destino no es v&aacute;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&eacute;n devuelve informaci&oacute;n sobre el estado del cauce. Esta funci&oacute;n nunca se bloquea; siempre retorna inmediatamente. El valor del estado puede ser usado por el cliente o el servidor para tomar la acci&oacute;n adecuada.
<P>#define INCL_BASE<BRbr />#include &lt;os2.h&gt;
 
<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&aacute;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&aacute;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&uacute;mero de bytes a leer del cauce.
|-
| pBytesRead
| Un puntero a una posici&oacute;n de memoria donde OS/2 devolver&aacute; el n&uacute;mero de bytes leidos.
|-
| pBytesAvail
| Un puntero a una zona de memoria de 4 bytes donde OS/2 devolver&aacute; el n&uacute;mero de bytes que est&aacute;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&oacute;n</U>
<TR><TD>ulBufferLen</TD><TD>N&uacute;mero de bytes a leer del cauce.</TD></TR>
|-
<TR><TD>pBytesRead</TD><TD>Un puntero a una posici&oacute;n de memoria donde OS/2 devolver&aacute; el n&uacute;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&aacute; el n&uacute;mero de bytes que est&aacute;n disponibles en el cauce. La estructura del buffer es:</TD></TR>
| N&uacute;mero de bytes que contiene el buffer del cauce (incluyendo bytes de cabecera y bytes que ya han sido examinados).
|-
| 15-0
| N&uacute;mero de bytes que componen el mensaje actual (0 para un cauce orientado a byte).
|}
|-
| pPipeState
| Un puntero a una posici&oacute;n de memoria donde OS/2 devolver&aacute; 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&aacute;ndose
|}
<br />El cauce est&aacute; ''desconectado'' inmediatamente despu&eacute;s de una llamada a '''DosCreateNPipe''' o a '''DosDisConnectNPipe'''.
 
<br />El cauce est&aacute; ''en escucha'' despu&eacute;s de que el servidor ejecute '''DosConnectNPipe'''.
<TR>
<br />El cauce est&aacute; ''conectado'' despu&eacute;s de que un cliente haya ejecutado con &eacute;xito '''DosOpen'''.
<TD><U>Bit</U></TD>
<TD><U>Descripci&oacute;n</U></TD>
</TR>
<TR>
<TD>32-16</TD>
<TD>N&uacute;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&aacute; ''cerr&aacute;ndose'' despu&eacute;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&uacute;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&oacute;n de memoria donde OS/2 devolver&aacute; 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&aacute;ndose</TD>
</TR>
</TABLE>
<BR>El cauce est&aacute; <I>desconectado</I> inmediatamente despu&eacute;s de una llamada a <B>DosCreateNPipe</B> o a <B>DosDisConnectNPipe</B>.
 
<BR>El cauce est&aacute; <I>en escucha</I> despu&eacute;s de que el servidor ejecute <B>DosConnectNPipe</B>.
<BR>El cauce est&aacute; <I>conectado</I> despu&eacute;s de que un cliente haya ejecutado con &eacute;xito <B>DosOpen</B>.
 
<BR>El cauce est&aacute; <I>cerr&aacute;ndose</I> despu&eacute;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&oacute;n sobre un <I>''named pipe</I>''.
 
<P>#define INCL_BASE<BRbr />#include &lt;os2.h&gt;
<P>HPIPE hpipeHandle;
<BRbr />PULONG pPipeHandleState;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosQueryNPHState(hpipeHandle, pPipeHandleState);
<P>
<P><TABLE><TH><H3>Par&aacute;metros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>El handle del <I>named pipe</I> a comprobar.</TD></TR>
! <H3>Par&aacute;metros</H3>
|-
| hpipeHandle
| El handle del ''named pipe'' a comprobar.
|-
| pPipeHandleState
| Un puntero a una posici&oacute;n de memoria donde OS/2 devolver&aacute; el estado del cauce.
|-
|
||
{| BORDER="1"
|-
 
<TD><U>Bit</U>
<TR><TD>pPipeHandleState</TD><TD>Un puntero a una posici&oacute;n de memoria donde OS/2 devolver&aacute; el estado del cauce.</TD></TR>
| <U>Descripci&oacute;n</U>
<TR><TD></TD><TD>
|-
<TABLE BORDER=1>
| 31-16 || Reservado.
<TR>
|-
<TD><U>Bit</U></TD>
| 15
<TD><U>Descripci&oacute;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&aacute; orientado a byte. Esto es, los datos son escritos como una r&aacute;faga de bytes, y recuperados de igual forma.
 
<br />01 = (NP_TYPE_MESSAGE) El cauce est&aacute; orientado a mensajes. Esto es, cada vez que se escribe algo, el sistema recuerda su longitud, y al recuperarlo devuelve exactamente el mismo n&uacute;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&aacute; 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&aacute;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&oacute;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&uacute;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 &lt; n &lt; 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&aacute; orientado a byte. Esto es, los datos son escritos como una r&aacute;faga de bytes, y recuperados de igual forma.
{|
<BR>01 = (NP_TYPE_MESSAGE) El cauce est&aacute; orientado a mensajes. Esto es, cada vez que se escribe algo, el sistema recuerda su longitud, y al recuperarlo devuelve exactamente el mismo n&uacute;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&aacute; 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&aacute;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&oacute;lo pueden ser leidos como bytes.</TD>
|-
</TR>
| 233 || Cauce no abierto
<TR>
|}
<TD>7-0</TD>
 
<TD><B>ICount</B> (Instance Count). N&uacute;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 &lt; n &lt; 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 &lt;os2.h&gt;
<P>HPIPE hpipeHandle;
<BRbr />ULONG ulPipeHandleState;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosSetNPHState(hpipeHandle, ulPipeHandleState);
<P>
<P><TABLE><TH><H3>Par&aacute;metros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>El handle del cauce a cambiar de estado.</TD></TR>
! <H3>Par&aacute;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&oacute;n</U>
<TR><TD></TD><TD>
|-
<TABLE BORDER=1>
| 31-16 || Reservado.
<TR>
|-
<TD><U>Bit</U></TD>
| 15
<TD><U>Descripci&oacute;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&aacute;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&oacute;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&aacute;metro no v&aacute;lido
<TD>9-8</TD>
|-
<TD>Modo de lectura.<BR>00 = (NP_READMODE_BYTE) Modo orientado a bytes. Lee el cauce como una r&aacute;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&oacute;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&aacute;metro no v&aacute;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&aacute;foro de evento compartido. Solo funciona con cauces locales. Si se intenta hacer con un cauce remoto (situado en otra m&aacute;quina de la red) dar&aacute; un error <B>'''Funci&oacute;n no v&aacute;lida</B>'''. Si ya hab&iacute;a un sem&aacute;foro asociado al cauce, <B>'''DosSetNPipeSem</B>''' lo reemplaza con el nuevo sem&aacute;foro.
 
<P>#define INCL_BASE<BRbr />#include &lt;os2.h&gt;
<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&aacute;metros</H3></TH>
{|
<TR><TD>hpipeHandle</TD><TD>El handle del cauce al que se le quiere asociar el sem&aacute;foro de evento.</TD></TR>
! <H3>Par&aacute;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&aacute;foro.</TD></TR>
| El handle del cauce al que se le quiere asociar el sem&aacute;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&oacute;n no v&aacute;lida</TD></TR>
|-
<TR><TD>6</TD><TD>HANDLE no v&aacute;lido</TD></TR>
| ulKeyHandle
 
| Un valor que permite distinguir eventos provenientes de cauces distintos asociados al mismo sem&aacute;foro.
<TR><TD>87</TD><TD>Par&aacute;metro no v&aacute;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&oacute;n no v&aacute;lida
|-
| 6 || HANDLE no v&aacute;lido
|-
| 87 || Par&aacute;metro no v&aacute;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&aacute;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&aacute; primero al que tenga mayor prioridad; si dos tienen la misma prioridad, recibir&aacute; la instancia el que lleve m&aacute;s tiempo esperando.
 
<P>#define INCL_BASE<BRbr />#include &lt;os2.h&gt;
<P>PSZ pszFileName;
<BRbr />ULONG ulTimeOut;
<BRbr />APIRET rc; /* Codigo de error */
<P>rc = DosWaitNPipe(pszFileName, ulTimeOut);
<P>
<P><TABLE><TH><H3>Par&aacute;metros</H3></TH>
{|
<TR><TD>pszFileName</TD><TD>Puntero a una cadena ASCIIZ con el nombre del cauce a abrir.</TD></TR>
! <H3>Par&aacute;metros</H3>
<TR><TD>ulTimeOut</TD><TD>El tiempo m&aacute;ximo, en milisegundos, que se esperar&aacute; 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&aacute;ximo, en milisegundos, que se esperar&aacute; 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&oacute;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&oacute;n
|-
| 231 || Cauce (''pipe'') ocupado.
|}