li_freedom 发表于 2014-03-25 16:47

请教 关于管道 select的问题

本帖最后由 li_freedom 于 2014-03-25 16:48 编辑

如题   

我是这样做的:

int creat_pipe()
{
      int pfifo;
      if(mkfifo("./tmp", S_IFIFO|0666) != 0)
      {
                perror("mkfifo:");
                return -1;
      }
      print("creat pipe ok\n");
      pfifo = open("./tmp",O_RDONLY|O_NONBLOCK,0);
      if(pfifo < 0)
      {
                perror("open:");
                return -2;
      }
      return pfifo;
}

int main()
{
      int pipe;
      int ret;
      char buf;
      fd_set fd_set;
      pipe = creat_pipe();

      while(1)
      {
                FD_ZERO(&fd_set);
                FD_SET(pipe,&fd_set);

                ret = select(pipe+1,&fd_set,NULL,NULL,NULL);
                if(ret < 0)
                {
                        perror("select error:");
                        continue;
                }
                if(ret == 0)
                {
                        printf("slect not ready\n");
                        continue;
                }
                if(FD_ISSET(pipe,&fd_set))
                {
                        read(pipe,buf,5);
                        printf("buf = %s\n",buf);
                }
                sleep(1);
               
      }
      return 0;

}


在另外一个进程里面打开管道往里写了个字符串。

我现在的现象是当另一个进程写完字符串后select检测到描述符变化然后读出字符串,可是这个时候我的程序会一直循环的读
就像这样:
buf = world·
buf = world·
buf = world·
buf = world·
buf = world·
buf = world·
buf = world·


是我的程序写错了吗?


不应该是读完了之后再次的等待着另一个进程写入吗?

这里为什么会一直读写入的最后一条信息呢?





timespace 发表于 2014-03-25 17:26

read返回值不判断?buf不清空?先好好找些参考资料理解下FIFO的行为:所有写端全部关闭时,读端read总是返回0。

li_freedom 发表于 2014-03-26 09:01

回复 2# timespace

二楼你好:
   你看这样哈:


   在刚开始的时候程序执行的while的时候会再select那个地方等待是吧,   这个时候另外一个进程开始写管道,写完了之后关闭描述符,

   select检测到有进程在写管道后才继续往下执行判断是哪个描述符背写了接着处理管道数据。

   之后while循环又回到select这里,这时候没有人在写管道了,这里不应该是再次的等待的进程写管道吗?


现在的程序里为什么会一直是可以继续往下执行而不是阻塞在select这里呢?

这里不应该是等待着再次有进程写管道的时候在继续往下执行吗?


   

timespace 发表于 2014-03-26 10:24

回复 3# li_freedom
我上面都写清楚了,写端关闭,read必定返回0,意味着前面的select一定是可读的,每次都是,最好不要自己臆测,这些IPC都有确定的行为,先看文档或参考书消灭这类低级错误。


   
页: [1]
查看完整版本: 请教 关于管道 select的问题