c - 命名管道的大小?进程卡住

标签 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;
    }

最佳答案

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

如果您想知道管道何时准备好读/写,您应该查看 man 2 selectman 2 poll 命令,它们会通知此类事件。

如果您使用阻塞调用,您还可以在 ioctl 调用中使用 FIONREAD:

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

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

关于c - 命名管道的大小?进程卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25281800/

相关文章:

go - 有队列实现吗?

c - fopen() 段错误,文件存在

c++ - 堆栈内存如何工作或函数变量如何在堆栈上分配和访问

c - C 中的高斯赛德尔(特定方程求解器)

linux进程地址空间解释?

python - 在 C 和 Python 之间读写 Fifo 文件

c - pclose() 在多线程环境中过早返回 (Solaris 11)

Linux命令'符号

mysql - 更新 mysql 配置变量 (ft_min_word_len)?

SQL——先进先出