{
printf("Father : can't create pipe\n");
exit(-1);
};
printf("Father : pipe is created\n");
pid = fork();
if(pid==-1)
{
printf("Fork ERR\n");
exit(1);
}
else if (pid==0)
{
f_in=fopen(filename,"r");
if (f_in<=0)
{
printf("open file ERR%s\n", filename);
exit(1);
}
else
{
printf("file's opened: \n%s\n", filename);
int i=0;
while( (fscanf(f_in,"%s",&buf))!=EOF)
i++;
write(filedes[1],buf,strlen(buf)); //ф-ция сына
close(f_in);
close(filedes[1]);
}
}
return 0;
else
{
read (filedes[0],buf_read,sizeof(buf_read)); //ф-ция отца
close(filedes[0]);
printf("reading.....\n %s\n",buf_read);
}
return 0;
}
Входной файл inp.txt: testing_text!!!
Результаты:
# ./pipe inp.txt
Father : pipe is created
file's opened:
inp.txt
reading.....
testing_text!!!ÿ"Ü7°"Ü7°"Ü7°¼
ò7°IZ7°·Z7°
Текст из файла считан целиком, кроме того, вывелись неопределенные значения из буфера. Особенностью данного метода является возможность обмена данными только между процессами-«родственниками», т.к. процесс может получить файловые дескрипторы для работы с неименнованнным каналом, только наследую их от родительского процесса.
IV. Именованные каналы
В файле server.c в основной программе:
Создайте 2 именованных канала, используя системный вызов mkfifo (),
аргументы которого: имя файла FIFO в файловой системе; флаги владения, прав доступа
(установите открытые для всех права доступа на чтение и на
запись S_IFIFO | 0666).
Откройте один канал на запись (chan1), другой - на чтение (chan2) и запустите
серверную часть программы server(fdr,
fdw); закройте файловые дескрипторы.
В серверной части программы:
Запишите имя файла в канал 1 (для записи) функцией write(); прочитайте данные из канала 2 в зарезервированный ранее буфер.
В файле client.c запрограммируйте в основной программе функции: открытия каналов для чтения (chan1) и записи (chan2); инициации клиентской части программы client(fdr, fdw); закрытия файловых дескрипторов и удаления каналов системным вызовом unlink(chan n).
В клиентской части программы: чтение имени файла из канала 1, сообщение серверу о начале записи, открытие канала 2 и запись в него данных, прочитанных из файла.
Client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
char* chan1="chan1";
char* chan2="chan2";
const int c_bsize=256;
int main (void)
{
int k = mkfifo("chan1", 0666);
if ((k=-1)&&(errno!=EEXIST))
{
printf("CLIENT ERR (chan1 creating) \n");
return -1;
}
k = mkfifo("chan2", 0666);
if ((k=-1)&&(errno!=EEXIST))
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.