Programación del entorno de Linux - Process Communication

  

Contenido experimental

Escriba un programa para implementar la comunicación de canalización. Use la tubería de llamada del sistema () para crear una tubería. Los dos procesos secundarios P1 y P2 escriben una oración en cada tubería: ¡

el niño 1 está enviando un mensaje!

¡el niño 2 está enviando un mensaje!

El proceso principal lee dos datos del proceso secundario de la canalización y los muestra (requiere recibir P1 primero, luego P2).


Orientación experimental

1. ¿Qué es un conducto?

Una de las contribuciones más importantes del sistema UNIX en el desarrollo de OS es la primera iniciativa del sistema. Una pipa Esta es también una característica importante del sistema UNIX.

La llamada canalización es un archivo compartido que se puede conectar a un proceso de escritura y de lectura y les permite comunicarse de la manera del productor y el consumidor, también conocido como archivo de canalización. El proceso de escritura escribe datos del lado de escritura de la canalización (identificador 1) en la canalización, mientras que el proceso de lectura lee datos del extremo de lectura de la canalización (identificador 0).


manejar fd [0]





Handle fd [1]

Reader





Write

En segundo lugar, el tipo de canalización:

1, denominada canalización

Un archivo con un nombre de ruta que puede existir en el sistema de archivos durante mucho tiempo. Creado con el sistema de llamada mknod (). Supera las limitaciones del uso de tuberías anónimas, lo que permite que más procesos se comuniquen utilizando tuberías. Por lo tanto, otros procesos pueden conocer su existencia y pueden usar el nombre de la ruta para acceder al archivo. El acceso a una tubería con nombre es lo mismo que acceder a otros archivos, primero abrir con abrir ().

2, canalización anónima

Un archivo temporal. Un archivo sin nombre (sin nombre de ruta) creado con pipe (). Solo el descriptor de archivo devuelto por la llamada al sistema se usa para identificar el archivo, por lo que solo el proceso que llama pipe () y sus descendientes pueden reconocer el descriptor de archivo para comunicarse con el archivo (pipe). Cuando estos procesos ya no utilizan esta canalización, el núcleo reclama sus nodos de índice.

Los métodos de lectura y escritura de las dos canalizaciones son los mismos. Este artículo solo habla de canalizaciones anónimas.

3, el establecimiento del archivo de canalización

asignar nodos de disco y de índice de memoria, asignar entradas de archivo para el proceso de lectura, asignar entradas de archivo para el proceso de escritura, asignar descriptores de archivo de usuario

4, exclusión mutua del proceso de lectura /escritura

El kernel establece un puntero de lectura y un puntero de escritura para la dirección, y lee y escribe en el orden de primero en entrar, primero en salir.

Para que los procesos de lectura y escritura accedan al archivo de canalización de manera mutuamente exclusiva, cada proceso debe ser mutuamente exclusivo para acceder a la entrada de dirección directa en el nodo de índice del archivo de tubería. Por lo tanto, cada vez que el proceso accede al archivo de tuberías, debe verificar si el archivo de índice se ha bloqueado. Si es así, el proceso se suspende, de lo contrario se bloquea y se lee /escribe. Desbloquee después de que finalice la operación y active el proceso que está en espera porque el nodo de índice está bloqueado.

Tres, la llamada al sistema involucrada

1, pipe ()

Crea un pipe anónimo.

Formato de llamada del sistema

pipe (filedes)

Definición del parámetro

int pipe (filedes);

int filedes [2];

donde filedes [1] es el final de escritura y filedes [0] es el final de lectura.

La función utiliza el archivo de encabezado de la siguiente manera:

#include < unistd.h >

#inlcude < signal.h >

#include < stdio.h >

2, read ()

Formato de llamada del sistema

read (fd, buf, nbyte)

Función: Desde fd Los nbyte bytes de datos se leen del archivo indicado y se envían al búfer indicado por el puntero buf. Si el archivo está bloqueado, espere hasta que el bloqueo esté abierto.

Definición del parámetro

int read (fd, buf, nbyte);

int fd;

char * buf;

unsigned Nbyte;

3, write ()

formato de llamada del sistema

read (fd, buf, nbyte)
función

: poner nbyte bytes Los datos se escriben desde el búfer apuntado por buf al archivo apuntado por fd. Si el archivo está bloqueado, la escritura se suspende hasta que se desbloquea el bloqueo.

La definición del parámetro es la misma que leída ().




Compile un programa para implementar la comunicación de canalización para el proceso. Utilice el sistema de llamada pipe () para crear una línea de tubería. Los dos procesos secundarios p1 y p2 escriben una oración en el canal:

¡el proceso child1 está enviando el mensaje!

el proceso child2 está enviando el mensaje!

el proceso principal es desde la tubería La información de los dos procesos se lee y se muestra en la pantalla.


Programa 1:
# include < unistd.h > # include < sys /types.h > # include < errno.h > # include < stdio.h > # include < stdlib.h > # include < string.h > int main () {int pipe_fd [2]; pid_t pid; char buf_r [100]; char * p_wbuf; int r_num; memset (buf_r, 0, sizeof (buf_r)); if (pipe (pipe_fd) < 0) {printf (" error de creación de la tubería \\ n "); devolver -1;} if ((pid = fork ()) == 0) {printf (" \\ n " close; (pipe_fd [1]); sleep (2); if ((r_num = read (pipe_fd [0], buf_r, 100)) > 0) {printf ("% d números leídos de la tubería es% s \\ n ", r_num, buf_r);} close (pipe_fd [0]); exit (0);} else if (pid > 0) {close (pipe_fd [0]); if (write (pipe_fd [1], " Hola ", 5)! = - 1) printf (" éxito de la escritura original! \\ n "); if (write (pipe_fd [1], " pipe ", 5)! = - 1) printf (" Parent write2 success! \\ N "); close (pipe_fd [1]); sleep (3); waitpid (pid, NULL, 0); exit (0);}}

Copyright © Conocimiento de Windows All Rights Reserved