【发布时间】:2010-12-23 03:35:17
【问题描述】:
我正在编写一个 c 应用程序,并希望执行一些外部程序并解析输出,类似于编写脚本和使用期望。
如何设置执行任务的超时时间? 我怎么知道没有更多数据可以从流中读取,即。它正在等待输入?
谢谢,
沃尔特
【问题讨论】:
标签: c inputstream
我正在编写一个 c 应用程序,并希望执行一些外部程序并解析输出,类似于编写脚本和使用期望。
如何设置执行任务的超时时间? 我怎么知道没有更多数据可以从流中读取,即。它正在等待输入?
谢谢,
沃尔特
【问题讨论】:
标签: c inputstream
您可以使用 select() 检查是否有可从流中读取的字节。如果没有,这很好地表明外部程序没有输出东西——它要么在等待输入,要么只是忙于工作。我认为没有一种通用的方法可以区分这两种状态。
【讨论】:
read。在 EOF,select 返回 fd 可读,但 read 读取零字节。
假设您正在使用符合 POSIX 的系统:
您可以通过使用类似select 的函数轮询任务的输入流来超时。 (See this tutorial)。使用feof 函数检测流的结尾。
【讨论】:
open, close, read, write, socket, accept, poll, select 等)与 C 标准库缓冲 I/O(fopen、fclose、fread、fwrite、fscanf、fprintf、feof 等)注意 @ 987654339@ 仅在fread 或类似之后工作,你真的不想混合缓冲和低级 I/O。
如何设置执行超时 任务?
使用select() 并设置超时。在调用 recv() 之前调用它。
我怎么知道没有了 从流中读取的数据,即。这是 等待输入?
这更棘手。您需要有一些协议,以便发送方可以提醒接收方它已完成。 HTTP的做法只是关闭发送端的socket,导致接收端的recv()返回零字节。
另一种方法是发送方发送一个特殊字符或字符序列。另一种方法,根据您的应用程序,您可能需要传输确切的字节数;不过这种情况很少见。
【讨论】: