/* Программа, осуществляющая однонаправленную связь через FIFO между процессом-родителем и процессом-ребенком */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(){
size_t size;
char resstring[14];
char name[]="aaa.fifo";
/* Обнуляем маску
создания файлов текущего процесса для того, чтобы
права доступа у создаваемого FIFO точно соотвествовали параметру вызова
mknod() */
(void)umask(0);
/* Попытаемся создать FIFO с именем aaa.fifo
в текущей директории */
if(mknod(name, S_IFIFO |
0666, 0) < 0){
/* Если создать FIFO не удалось, печатаем об этом сообщение
и прекращаем работу */
printf("Can\'t create FIFO\n");
exit(-1);
/* Порождаем новый процесс */
if((result = fork()) < 0){
printf("Can\'t fork child\n");
exit(-1);
if((fd = open(name, O_WRONLY)) < 0){
/* Если открыть FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t open FIFO for writting\n");
exit(-1);
/* Пробуем записать в FIFO 14 байт, т.е. всю строку
"Hello, world!"
вместе с признаком конца строки */
size = write(fd, "Hello, world!", 14);
if(size != 14){
/* Если записалось меньшее количество байт, сообщаем
об ошибке и завершаем работу */
printf("Can\'t write all string to FIFO\n");
exit(-1);
/* Закрываем входной поток данных и на этом родитель
прекращает работу */
close(fd);
printf("Parent exit\n");
if((fd = open(name, O_RDONLY)) < 0){
/* Если открыть FIFO не удалось, печатаем об этом
сообщение и прекращаем работу */
printf("Can\'t open FIFO for reading\n");
exit(-1);
/* Пробуем прочитать из FIFO 14 байт в массив, т.е.
всю записанную строку */
size = read(fd, resstring, 14);
if(size < 0){
/* Если прочитать не смогли, сообщаем об ошибке и завершаем работу */
printf("Can\'t read string\n");
exit(-1);
/* Печатаем прочитанную строку */
printf("%s\n",resstring);
/* Закрываем входной поток и завершаем работу */
close(fd);
}
return 0;