我使用创建一个名为posix的管道,例如pipe_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()写入字符串(必须处理返回值)