Удаление созданных именованных каналов - PullRequest
1 голос
/ 27 мая 2019

У меня есть этот код, который синхронизирует процесс с использованием именованных каналов:

#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);

    }
}

Обычно код отца находится внутри цикла, поэтому ребенок не застревает. Что я заметил, так это то, что после концептуальных запусков этой программырезультат необоснованный (не просто неправильный). Я думаю, что это происходит потому, что созданные каналы не умирают между запусками программы, поэтому результат является предсказуемым. Кажется, что закрываемый канал блокирует канал до тех пор, пока он кем-то не открыт, но не уничтожит его.могу ли я уничтожить эти каналы в конце программы, чтобы при повторном запуске я не стал причиной этой проблемы?

...