tubería nombrada de linux mkfifo

  


Tabla de contenido

prefacio

descripción general

Introducción al principio

Descripción de la interfaz

demostración de código

fin


prefacio

Esta columna comparte principalmente conocimientos sobre programación concurrente en Linux, incluidos multiproceso, multiproceso, comunicación entre procesos/procesos, control de sincronización concurrente y mejora del rendimiento en alta concurrencia. Deje un mensaje.


descripción general

Cómo transferir una pequeña cantidad de datos entre diferentes procesos y programas, y usarlos en forma de bloqueo, esto usa canalizaciones. Hay dos tipos de canalizaciones, canalizaciones sin nombre y canalizaciones con nombre.Debido a que el proceso secundario puede copiar el contexto del proceso principal, las canalizaciones sin nombre se utilizan entre los procesos principal y secundario, mientras que las canalizaciones con nombre se comparten entre diferentes procesos a través de nombres de ruta, que es más general.

Introducción al principio

Las canalizaciones con nombre son un mecanismo para la comunicación entre procesos, que se puede utilizar para transferir datos entre dos procesos. Específicamente, una canalización con nombre es un tipo especial de archivo que se puede abrir y leer y escribir en diferentes procesos, logrando así la comunicación entre procesos. En general, en el sistema Linux, la creación y el uso de canalizaciones con nombre se implementan a través de la API correspondiente del lenguaje C.

Después de crear el archivo de canalización, se puede ver en la ruta que su tipo de archivo es p, lo que indica que es un archivo de canalización. El archivo de tubería es diferente de los archivos ordinarios en que se bloqueará al escribir hasta que se lean los datos, y si no hay datos al leer, se bloqueará y esperará hasta que se escriban los datos.

Las canalizaciones con nombre también se pueden crear a través de los comandos del sistema, de la siguiente manera:

[senllang @ localhost pipetest] $ mkfifo / tmp / myfilo

[senllang@localhost pipetest]$ ll /tmp/

total 0

prw-r--r--. 1 desarrollo obvio 0 8 de abril 15:52 myfilo

Puede ver que el tipo de archivo de canalización es p, y abrimos dos terminales para pruebas de lectura y escritura.

Terminal uno escribe

[senllang@localhost pipetest]$ echo "hola" > /tmp/myfifo 

Debido a que no hay lectura, se bloqueará en este momento.

La terminal 2 lee

[senllang@localhost ~]$ gato /tmp/myfifo

Hola

Se puede ver que se lee hola, y el terminal 1 también se desbloqueará en este momento. Del mismo modo, leer primero también bloqueará hasta que se escriban los datos.

Descripción de la interfaz

(1) Creación de archivos de canalización

#include <sys/types.h>

#include <sys/stat.h>



int mkfifo(const char *pathname, mode_t mode);

Cree un archivo de canalización pasando el nombre de ruta y el permiso de modo.

#include <fcntl.h>           /* Definition of AT_* constants */

#include <sys/stat.h>



int mkfifoat(int dirfd, const char *pathname, mode_t mode);

Esta es otra versión, cuando el nombre de ruta es una ruta relativa, la ruta de creación está en el directorio especificado por dirfd. Cuando dirfd es AT_FDCWD, el efecto de usar mkfifo es el mismo.

(2) Abrir/leer/escribir/cerrar archivo de canalización

Operaciones de archivo de uso común abrir/leer/escribir/cerrar

(3) Eliminar el archivo de canalización

desvincular (fd)

Cuando la canalización se agota, el archivo de la canalización debe eliminarse, de forma similar a la eliminación de un archivo.

demostración de código

#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>

int main()
{
    int fd;
    char *myfifo = "/tmp/myfifo";
    char input[256];
    char output[256];

    /* create named pipe */
    mkfifo(myfifo, 0666);

    /* open named pipe for reading */
    fd = open(myfifo, O_RDWR);

    while(1) 
    {
      /* read input from named pipe */
      read(fd, input, 256);

      /* convert input to uppercase */
      int i;
      for (i = 0; input[i]; i++) 
      {
        output[i] = toupper(input[i]);
      }

      /* write output to named pipe */
      int len = i;
      write(fd, output, len);
    }

    /* close named pipe */
    close(fd);
    unlink(myfifo);

    return 0;
}

Después de compilar y ejecutar, el programa convierte la cadena en la tubería a mayúsculas y luego la escribe en la tubería.


[transmit@localhost pipetest]$ gcc mkfifo_ex01.c -o mkfifo_ex01
[transmit@localhost pipetest]$ ./mkfifo_ex01

Escribe la cadena en otra terminal,

[senllang@localhost ~]$ echo "hola" >/tmp/myfifo
[senllang@localhost ~]$ cat /tmp/myfifo
HOLA
 


fin

Correo electrónico del autor: [email protected]
Si hay errores u omisiones, indíquelos y aprendan unos de otros. Además, si quieres saber algo, también puedes enviarme un correo electrónico para discutir entre nosotros, y lo sabrás todo.

Nota: ¡No reimprimir sin consentimiento!

Guess you like

Origin blog.csdn.net/senllang/article/details/130035544