0

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

4

1 回答 1

0

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

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

如果要检测管道状态,则不应使用缓冲函数,但:

  • open() 打开先进先出/管道
  • select() 测试文件描述符是否可写
  • write() 写入字符串(必须处理返回值)
于 2012-06-08T15:46:11.083 回答