Cómo usar la función de tubería en el lenguaje C

Cómo usar la función de tubería en el lenguaje C

Una tubería es un medio para la comunicación entre procesos. Un proceso escribe datos en la tubería, y otro proceso lee los datos de la tubería. En este artículo, veremos cómo se utiliza la función Pipe () para implementar el concepto utilizando el lenguaje C.

Acerca de la tubería

En la tubería, los datos se mantienen en un orden FIFO, lo que significa escribir datos en un extremo de la tubería secuencialmente y leer datos de otro extremo de la tubería en el mismo orden secuencial.

Si algún proceso se lee desde la tubería, pero ningún otro proceso aún no ha escrito en la tubería, entonces lee devuelve el fin de archivo. Si un proceso quiere escribir en una tubería, pero no hay otro proceso conectado a la tubería para leer, entonces esta es una condición de error, y la tubería genera una señal Sigpipe.

Archivo de cabecera

#incluir

Sintaxis

int pipe (int archivo [2])

Argumentos

Esta función toma un solo argumento, una matriz de dos enteros (archivado). Archiva [0] se usa para leer desde la tubería y Archiva [1] se usa para escribir en la tubería. El proceso que quiere leer desde la tubería debe cerrar Archiva [1], y el proceso que quiere escribir en la tubería debe cerrar Archiva [0]. Si los extremos innecesarios de la tubería no se cierran explícitamente, entonces el final de la fila (EOF) nunca se devolverá nunca.

Valores de devolución

Sobre el éxito, el tubo() Devuelve 0, para el fracaso, la función devuelve -1.

Picorialmente, podemos representar el tubo() función de la siguiente manera:

A continuación se presentan algunos ejemplos que representan cómo usar la función de la tubería en el lenguaje C.

Ejemplo 1

En este ejemplo, veremos cómo funciona la función de la tubería. Aunque usar una tubería en un solo proceso no es muy útil, pero tendremos una idea.

// Ejemplo 1.C
#incluir
#incluir
#incluir
#incluir
int main ()

int n;
int archiva [2];
buffer de char [1025];
Char *Message = "Hola, mundo!";
tubería (archiva);
escribir (archiva [1], mensaje, strlen (mensaje));
if ((n = read (archiva [0], buffer, 1024))> = 0)
buffer [n] = 0; // Terminar la cadena
printf ("leer %d bytes de la tubería:" %s "\ n", n, búfer);

demás
perror ("leer");
salida (0);

Aquí hemos creado una tubería primero usando tubo() función luego escrita en la tubería usando Filtes [1] fin. Luego, los datos se han leído utilizando el otro extremo de la tubería, que es Archiva [0]. Para leer y escribir en el archivo, solíamos leer() y escribir() funciones.

Ejemplo2

En este ejemplo, veremos cómo se comunican los procesos de padres e hijos usando la tubería.

// Ejemplo2.C
#incluir
#incluir
#incluir
#incluir
#incluir
int main ()

int presenta [2], nbytes;
pid_t childpid;
Char String [] = "Hola, mundo!\norte";
Char Readbuffer [80];
tubería (archiva);
if ((childPid = fork ()) == -1)

Perror ("tenedor");
salida (1);

if (childPid == 0)

cerrar (archiva [0]); // El proceso del niño no necesita este extremo de la tubería
/ * Enviar "cadena" a través del lado de salida de la tubería */
escribir (archiva [1], string, (strlen (string) +1));
salida (0);

demás

/ * El proceso principal cierra el lado de salida de la tubería */
cerrar (archiva [1]); // El proceso principal no necesita este extremo de la tubería
/ * Leer en una cadena desde la tubería */
nbytes = read (archiva [0], readbuffer, sizeof (readbuffer));
printf ("Leer cadena: %s", readBuffer);

return (0);

Primero, se ha creado una tubería utilizando la función de la tubería, luego se ha bifurcado un proceso infantil. Luego, el proceso del niño cierra el extremo de lectura y escribe en la tubería. El proceso principal cierra el extremo de escritura y lee desde la tubería y lo muestra. Aquí el flujo de datos es solo una forma que es de un niño a otro.

Conclusión:

tubo() es una poderosa llamada de sistema en Linux. En este artículo, hemos visto solo flujo de datos unidireccional, un proceso escribe y otro proceso se lee, creando dos tuberías que también podemos lograr el flujo de datos bidireccional.