我使用创建一个名为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()写入字符串(必须处理返回值)

09-10 01:27
查看更多