Применение неименованных каналов реально только для взоимодействия родственных процессов. То есть неименованный канал должен быть создан до создания процессов. И неименованные каналы закрываются при завершении процесса.
Чтобы устронить эти недостатки предлогается механизм именованных каналов (или канал FIFO). При его создании создается и его имя:
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *pathname,mode_t mode);
Создается именованный канал с именем указаным в качестве первого аргумента и правами доступа, определенными вторым аргументом с учетом маски создания файла.
После того как канал создан он должен быть открыт функцией open. Если канал открыт каким-то процессом для чтения, то процесс будет заблокирован до тех пор пока другой процесс не откроет его для записи или наоборот.Можно также выполнить не блокируемый вызов для канала FIFO.
fd=open(“/tmp/fifo1”,O_WRONLY|O_NONBLOCK);
В таком случае open вернет значение -1, а в errno установится ENXIO
#include<fcntl>
#include<stdio.h>
#include<string.h>
#include<errno.h>
|
|
#define MSG_S 60
char *fifo=“F_FIFO”;
main(int argc,char **argv)
{ int fd,j,n_w;
char msgbuf[MSG_S];
if(argc<2)
exit(1);
if((fd=open(fifo,O_WRONLY|O_NONBLOCK))<0)
exit(2);
for(j=1;j<argc;j++)
{ if(strlen(argv[j])>MSG_S)
continue;
strcpy(msgbuf,argv[j]);
if((n_w=write(fd,msgbuf,MSG_S+1))==-1)
exit(3);
}
exit(0);
}
#include<fcntl>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#define MSG_S 60
int main(int argc,char **argv)
{ int f1;
char msgbuf[MSG_S+1]
if(mkfifo(fifo,0666)==-1)
{ if(errno!=EEXIST)
{ printf(“Ошибка, чтения mkfifo\n”);
exit(1);
}
if((fd=open(fifo,0_RDONLY))<0)
exit(2);
for(;;)
{ if(read(fd,msgbuf,MSG_S+1)<0)
exit(3);
printf(“Получено сообщение %s\n”,msgbuf);
}
}
}