Я пишу 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_