Краткое изложение обучения Linux (11) IPC-метод с именем канала FIFO

ФИФО

      FIFO часто называют именованным каналом для различения каналов. Каналы могут использоваться только между «связанными с кровью» процессами, но через FIFO несвязанные процессы также могут обмениваться данными.
      FIFO - один из основных типов файлов в Linux. Однако файл FIFO не имеет блока данных на диске. Он используется только для идентификации канала в ядре. Каждый процесс может открывать этот файл для чтения / записи. Фактически, это чтение и запись канала ядра. Таким образом, осуществляется межпроцессное взаимодействие.

Использование:
Команда: mkfifo pipe name
Библиотечная функция: int mkfifo (const char * pathname, mode_t mode); вернуть 0 в случае успеха, вернуть -1 в случае неудачи.
После создания FIFO с помощью mkfifo вы можете использовать open, чтобы открыть его, обычно В FIFO можно использовать функции ввода-вывода файлов, такие как закрытие, чтение, запись, разъединение и т. д.

Создайте средство записи файла именованного канала myfifo
Вставьте описание изображения сюда
:

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

void sys_err(char *str)
{
    
    
    perror(str);
    exit(-1);
}

int main(int argc, char *argv[])
{
    
    
    int fd, i;
    char buf[4096];

    if (argc < 2) {
    
    
        printf("Enter like this: ./a.out fifoname\n");
        return -1;
    }
    fd = open(argv[1], O_WRONLY);
    if (fd < 0) 
        sys_err("open");

    i = 0;
    while (1) {
    
    
        sprintf(buf, "hello itcast %d\n", i++);

        write(fd, buf, strlen(buf));
        sleep(1);
    }
    close(fd);
    return 0;
}

Конец чтения:

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

void sys_err(char *str)
{
    
    
    perror(str);
    exit(1);
}

int main(int argc, char *argv[])
{
    
    
    int fd, len;
    char buf[4096];

    if (argc < 2) {
    
    
        printf("./a.out fifoname\n");
        return -1;
    }
    fd = open(argv[1], O_RDONLY);
    if (fd < 0) 
        sys_err("open");
    while (1) {
    
    
        len = read(fd, buf, sizeof(buf));
        write(STDOUT_FILENO, buf, len);
        sleep(3);           //多个读端时应增加睡眠秒数,放大效果.
    }
    close(fd);

    return 0;
}

рекомендация

отblog.csdn.net/bureau123/article/details/112272353