【问题标题】:c - detecting end of streamc - 检测流结束
【发布时间】:2010-12-23 03:35:17
【问题描述】:

我正在编写一个 c 应用程序,并希望执行一些外部程序并解析输出,类似于编写脚本和使用期望。

如何设置执行任务的超时时间? 我怎么知道没有更多数据可以从流中读取,即。它正在等待输入?

谢谢,

沃尔特

【问题讨论】:

    标签: c inputstream


    【解决方案1】:

    您可以使用 select() 检查是否有可从流中读取的字节。如果没有,这很好地表明外部程序没有输出东西——它要么在等待输入,要么只是忙于工作。我认为没有一种通用的方法可以区分这两种状态。

    【讨论】:

    • 有办法告诉。 EOF 是一个零字节的read。在 EOF,select 返回 fd 可读,但 read 读取零字节。
    【解决方案2】:

    假设您正在使用符合 POSIX 的系统:

    您可以通过使用类似select 的函数轮询任务的输入流来超时。 (See this tutorial)。使用feof 函数检测流的结尾。

    【讨论】:

    • 不,你混淆了低级 UNIX I/O (open, close, read, write, socket, accept, poll, select 等)与 C 标准库缓冲 I/O(fopenfclosefreadfwritefscanffprintffeof 等)注意 @ 987654339@ fread 或类似之后工作,你真的不想混合缓冲和低级 I/O。
    【解决方案3】:

    如何设置执行超时 任务?

    使用select() 并设置超时。在调用 recv() 之前调用它。

    我怎么知道没有了 从流中读取的数据,即。这是 等待输入?

    这更棘手。您需要有一些协议,以便发送方可以提醒接收方它已完成。 HTTP的做法只是关闭发送端的socket,导致接收端的recv()返回零字节。

    另一种方法是发送方发送一个特殊字符或字符序列。另一种方法,根据您的应用程序,您可能需要传输确切的字节数;不过这种情况很少见。

    【讨论】:

    • 谢谢,但这实际上是为了解析命令行输出,所以我不会使用recv。 select() 对我有用。
    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 2012-06-22
    • 2014-08-14
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多