Как скопировать содержимое файла в другой файл при помощи именованного канала FIFO?

Не могу понять, как реализовать копирование содержимого файла посредством именованного канала. Написал программу , которая создает канал и в дальнейшем выводит строку в консоль.Но, этого мало.Нужно непосредственное взаимодействие между файлами их содержимым.Не понимаю как это реализовать.

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

#define FIFO_NAME "myfifo"

int main (int argc, char ** argv)
{
    int fifo;
    
    if (argc < 2) {
        fprintf (stderr, "Too few arguments\n");
        return 1;
    }
    fifo = open (FIFO_NAME, O_WRONLY);
    if (fifo == -1) {
        fprintf (stderr, "Cannot open fifo\n");
        return 1;
    }
    if (write (fifo, argv[1], strlen (argv[1])) == -1) {
        fprintf (stderr, "write() error\n");
        return 1;
    }
    close (fifo);
    return 0;
}

Этот пример кода сервера именованного канала.Думал о том, чтоб добавить где-то в окнец кода пару функций типа open read write для получения дескриптора и в дальнейшем считывания содержимого.Но,куда их именно пихать??? есть так же еще и клиентская сторона :

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

#define FIFO_NAME "myfifo"
#define BUF_SIZE 512


int main (void)
{
    FILE * fifo;
    char * buf;
    if (mkfifo ("myfifo", 0640) == -1) {
        fprintf (stderr, "Can't create fifo\n");
        return 1;
    }
    fifo = fopen (FIFO_NAME, "r");
    if (fifo == NULL) {
        fprintf (stderr, "Cannot open fifo\n");
        return 1;
    }
    buf = (char *) malloc (BUF_SIZE);
    if (buf == NULL) {
        fprintf (stderr, "malloc () error\n");
        return 1;
    }
    fscanf (fifo, "%s", buf);
    printf ("%s\n", buf);
    fclose (fifo);
    free (buf);
    unlink (FIFO_NAME);
    return 0;
}

Опять же, я прекрасно понимаю, как реализовать копирование содержимого файла в другой посредством тех же системных вызовов ну или библиотечных, но, в случае системных вызовов, приходится испольозовать буфер обмена.Здесь же именованный канал.Если я буду так же добавлять функции открытия чтения и записи, то придется испольозовать буфер.Но, по логике вещей, если у тебя есть канал, зачем тебе буфер(исправбье меня пж, если не прав).Я так понимаю именованный канал выступает неким буфером обмена между процессами что ли.Тогда как его испольозвать при копировании содержимого в другой файл??? Объясните ,пожалуйста.


Ответы (0 шт):