检查管道状态

标签 c printf pipe

我创建了一个命名的 posix 管道,例如 pipeline_out,使用

mkfifo $path_tmp/pipe_out

用 C 语言打开

out_pipe = fopen(TMP_PATH "/pipe_out", "w");

并使用 fprintf 命令写入

fprintf(out_pipe,"%s",string);

我想我可以使用 fprintf 的返回值来检查写入了多少内容并将其与字符串的实际长度进行比较,以了解完整的字符串是否已写入管道。然后,如果它(过)满了,我会以某种方式暂停并尝试从尚未写入的内容开始无限循环地再次写入......

这具体看起来是什么样子,是否有一种更高级的方法可以在管道满时自动停止(暂停)fprintf。

最佳答案

如果您想主动检测管道何时已满,那么使用 fprintf() 并不是一个好主意,因为它会在内部缓冲您的数据。

即使管道 fd 不再可写,fprintf() 也将继续返回,除非内部缓冲区也已满。在这种情况下,它不会返回缩短的值,而是会阻塞,直到它可以写入/缓冲整个字符串。

如果你想检测管道状态,你不应该使用缓冲函数,但是:

  • open() 打开 fifo/管道
  • select() 测试文件描述符是否可写
  • write()写入字符串(必须处理返回值)

关于检查管道状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10721189/

相关文章:

c - Linux 中的 Fifos 数据包模式

c - C 中的管道 - 命令 2 中的错误

C比较指针(带字符)

c++ - 学习 c/c++ 图像处理的好地方?

c - 为什么我们甚至不允许在 switch-case 中使用全局 const 限定变量?IBM 支持门户提示我们可以

c - 没有结构名称的结构

c - 程序在ID号调用时循环,并且没有在数组中输入信息

c++ - 奇怪的行为 printf( ) 每行调用 10-13 次

c - 分配 : error double free with printf and a NULL wchar_t*

angular - 如何使用 Angular 搜索管道显示未找到记录消息