我创建了一个命名的 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/