命名管道的大小?流程陷入困境

时间:2014-08-13 08:44:47

标签: c linux fifo

如何确定命名管道中有多少字节?

我想在插入新对象之前检查是否还有足够的空间。目前,如果接收过程要将对象从管道中取出或者是否崩溃,我的发送过程会卡住。

我的代码如下:

/*We open the fifo for read and write*/
  if((fd_fifo=open(fifo_name, O_RDWR)) == - 1)
    {
       snprintf (retval, strlen(retval), "Can't open the fifo: %s", fifo_name);
      *length = strlen(retval);
      return retval;
    }

//  write(fd_fifo,puffer,strlen(puffer)) ;

  int wbytes = write(fd_fifo,messagebody,strlen(messagebody)) ;

  if (wbytes == -1)
    {
       snprintf (retval, strlen(retval), "Can't write to fifo: %s", fifo_name);
      *length = strlen(retval);
      return retval;
    }

1 个答案:

答案 0 :(得分:3)

通常,当您使用writeread系统调用时,会在命名管道上发生阻塞。因此,如果打开管道进行读取,则该过程将阻塞,直到某个其他进程打开它进行写入,反之亦然。如果不希望出现这种情况,可以在O_NONBLOCK调用中使用open()标志来禁用默认阻止操作。

如果您想知道管道何时可以读/写,您应该查看man 2 selectman 2 poll命令,这些命令会通知此类事件。

如果您使用屏蔽通话,还可以在FIONREAD电话中使用ioctl

 rc = ioctl(pipefd, FIONREAD, &nBytesAvailable);

请注意,ioctl()调用行为是实现定义的,您应该检查系统的手册页(man 2 ioctl)以获得更准确的想法。