Проблема записи в выходной файл с использованием каналов - PullRequest
0 голосов
/ 20 февраля 2020

Я пишу C программу по работе мультиплексирования транспортного уровня с использованием инструментов ОС. Существует 3 потока битов в file1, file2 и file3 соответственно. Я последовательно читаю 10 битов из file1, file2, file3, объединяю их в кадр и сохраняю в файле multiplex.

Учитывая, что единственным средством связи является канал, созданный вы.

Обратите внимание: я не использовал функцию fwrite и хотел узнать больше о каналах.

Соответствующий код:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>


int main()
{
        int fd[3][2], pid,i, ch_count=10, count, status,f;
        FILE *fp, *fp1;
        fp1=fopen("multiplex.txt", "w");
        char ch, inp[10];

        for(i=0;i<3;i++)
                pipe(fd[i]);

        for(i=0;i<3;i++)
        {
                pid=fork();
                if(pid==0)
                {
                        printf("Inside Child process \n");
                        f=fileno(fp1);
                        close(fd[i][0]);
                        dup2(fd[i][1],f);
                        if(i==0)
                                        fp=fopen("file1.txt","r");
                        else if(i==2)
                                        fp=fopen("file2.txt","r");
                        else
                                        fp=fopen("file3.txt", "r");
                        while(1)
                        {
                                count=0;
                                while(( ch = fgetc(fp) ) != EOF && count<=ch_count)
                                        inp[count++]=ch;
                                if(ch==EOF)
                                        exit(0);
                                printf("The string read is %s \n", inp);
                                write(fd[i][1], inp, 10);
                                sleep(3-i);
                        }
                        close(fd[i][1]);
                }
                else
                        printf("Parent process \n");
        }
        return 0;
}

Проблема:

i) Я не могу ничего записать в multiplex файл.

ii) Я читаю чужие символы, когда печатаю строку inp. Более того, считываемые строки не в последовательности (то есть сначала file1, затем file2, а затем file3). Вывод:

The string read is s not goldAR^�q�@�      //from file 2
                                     �7�U 
The string read is l that glitR^�q�@�      //from file 2 again
                                     �7�U 
The string read is s over the R^�q�@�      //from file 1
                                     �7�U 
The string read is well that eR^�q�@�      //from file 3
                                     �7�U 
The string read is ers is not R^�q�@�      //from file 2
                                     �7�U 
The string read is oldAll thatR^�q�@�
                                     �7�U 
The string read is ds well.AllR^�q�@�
                                     �7�U 
The string read is glitters isR^�q�@�
                                     �7�U 
The string read is azy dogThe R^�q�@�
                                     �7�U 
The string read is not goldAllR^�q�@�

В чем проблема?

Редактировать: Содержимое файла1

The_quick_brown_fox_jumps_over_a_lazy_dog_The_quick_brown_fox_jumps_over_a_lazy_dog_`

Содержимое файла2

The_quick_brown_fox_jumps_over_a_lazy_dog_The_quick_brown_fox_jumps_over_a_lazy_dog_

Содержимое файла3

All's_well_that_ends_well_All's_well_that_ends_well_All's_well_that_ends_well_

1 Ответ

2 голосов
/ 20 февраля 2020

i) Я ничего не могу записать в мультиплексный файл.

от

        fp1=fopen("multiplex.txt", "w");
        /* ... */
                        f=fileno(fp1);
                        dup2(fd[i][1],f);

вы отстраняете fp1 от «multiplex.txt» (внутри детей). Использование fp1 в дочерних элементах было бы рискованным / неопределенным, поскольку FILE обычно буферизуется, и изменения в позиции буфера не могут быть разделены между процессами.

Вам придется перепроектировать вашу программу (запись в pipe в дети, читайте в родительском) для реализации требуемой функциональности.

ii) Я читаю инопланетные символы при печати строки inp.

                                while(( ch = fgetc(fp) ) != EOF && count<=ch_count)
                                        inp[count++]=ch;
                                /* ... */
                                printf("The string read is %s \n", inp);

не ноль -определить это. Либо сделайте inp[count] = '\0' перед printf, либо используйте

                                printf("The string read is %.*s \n", (int)count, inp);
...