У меня есть этот код, который синхронизирует процесс с использованием именованных каналов:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
int main()
{ int fd,val,i,fd2;
pid_t c1;
char *myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
char *myfifo2 = "/tmp/myfifo2";
mkfifo(myfifo2, 0666);
c1=fork();
if(c1==0){
for( i=0;i<6;i++){
if(i==1||i==3||i==5){
fd = open(myfifo, O_RDONLY);
read(fd, &val, sizeof(val));
close(fd);
for(int i=0;i<5;i++){
printf("critical:2\n");
}
fd2 = open(myfifo2, O_WRONLY);
write(fd2, &val, sizeof(val));
}
if(i==0||i==2||i==4){
for(i=0;i<7;i++){
printf("non critical:2\n");
}
}}}
if(c1>0){
val=10;
fd = open(myfifo, O_WRONLY);
write(fd, &val, sizeof(val));
fd2 = open(myfifo2, O_RDONLY);
read(fd2, &val, sizeof(val));
close(fd2);
wait(0);
}
}
Обычно код отца находится внутри цикла, поэтому ребенок не застревает. Что я заметил, так это то, что после концептуальных запусков этой программырезультат необоснованный (не просто неправильный). Я думаю, что это происходит потому, что созданные каналы не умирают между запусками программы, поэтому результат является предсказуемым. Кажется, что закрываемый канал блокирует канал до тех пор, пока он кем-то не открыт, но не уничтожит его.могу ли я уничтожить эти каналы в конце программы, чтобы при повторном запуске я не стал причиной этой проблемы?