Именнованные каналы

Применение неименованных каналов реально только для взоимодействия родственных процессов. То есть неименованный канал должен быть создан до создания процессов. И неименованные каналы закрываются при завершении процесса.

Чтобы устронить эти недостатки предлогается механизм именованных каналов (или канал 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);

}

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: