删除创建的命名管道

时间:2019-05-27 12:13:13

标签: c pipe

我有这段代码可以使用命名管道同步过程:

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

    }
}

通常父亲的代码在循环中,这样孩子就不会卡住。我注意到的是,在连续运行该程序后,结果是不合理的(不仅是错误的)。我认为这是因为创建的管道不会在两次之间死亡程序运行,因此结果是可预测的。关闭管道似乎会阻塞管道,直到有人将其打开,而不是销毁它。因此,我如何才能在程序结束时销毁这些管道,以便再次运行它不会导致有问题吗?

0 个答案:

没有答案