Невозможно отправить данные размером более 64 КБ с каналами в C - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь отправить файл usr / share / dict / words (размером около 971 КБ) из родительского процесса в два дочерних процесса через именованные каналы. Однако вывод пуст, и я не получил никаких ошибок. Я ждал минуту, но ничего не изменилось. Программа отлично работает с 10 КБ данных, которые я пробовал. Я знаю, что размер конвейерного буфера составляет 64 КБ, но кто-то может объяснить, что не так с моим подходом:

Здесь в коде: - ptr_child_1 относится к указателю общей памяти, 1 МБ сопоставленного сегмента сопоставлено. - fd и sd - каналы, файл - указатель файла

Код длинный, поэтому я не вставил все из них. Мне просто интересно, как мне отправить этот большой файл

Родительская запись:

mknod(FIFO_1, S_IFIFO | 0666, 0);
mknod(FIFO_2, S_IFIFO | 0666, 0);

// open pipes
int fd = open(FIFO_1, O_WRONLY);
int sd = open(FIFO_2, O_WRONLY);

char str[3000];
while(fgets(str, sizeof(str), file) > 0)
{
   // write all lines of file
   write(fd, str, strlen(str));
   write(sd, str, strlen(str));
}
 // send EOF explicitly
        write(fd, "\0", 1);
        write(sd, "\0", 1);
        // close file and pipes
        close(fd);
        close(sd);
        fclose(file);

Дочерняя запись:

    int num;
    char s[3000];
    while((num = read(fd, s, sizeof(s))) > 0)
    {     
        sprintf(ptr_child_1, "%s", s);
        ptr_child_1 += num;
    }
    // close pipe
    close(fd);
...