- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我正在读取 execlp 的子程序的输入行。所以基本上,如果子程序无法正确执行,它在读取时不应该是管道信息,并且会抛出错误。
我尝试轮询文件描述符,无论程序是否正确执行,它都会返回一个。所以基本上我通过了 poll,然后 fgetc 挂起/阻塞,因为没有什么可读的,但 fgetc 也没有返回 -1。
阅读和投票:
char* read_line(int fd) {
// fd is a pipe's read end. I know it reads properly.
FILE *file = fdopen(fd, "r");
int ret;
struct pollfd fdinfo[1];
fdinfo[0].fd = fd;
fdinfo[0].events = POLLIN;
ret = poll(fdinfo,1, 1000);
if (ret < 0) {
return "NOPE";
}
char* result = malloc(sizeof(char) * 80);
memset(result, 0, sizeof(int));
int position = 0;
int next = 0;
while (1) {
next = fgetc(file); //STALLING HERE
if (next == '!') {
free(result);
return "!";
}
if (next == EOF || next == '\n') {
result[position] = '\0';
return result;
} else {
result[position++] = (char)next;
}
}
}
最佳答案
您没有充分检查 poll()
向您提供的信息。您确实可以通过返回 -1 来检测 poll()
报告错误的情况,但否则并不能保证有任何数据可供读取。负返回值表示 poll() 未能完成其工作;它不会告诉您任何轮询文件描述符的状态。
首先,如果超时,poll()
将返回 0。在这种情况下,您的代码只是向前滚动并尝试从文件描述符中读取,这将阻塞,除非数据恰好在 poll()
返回和调用 fgetc( )
。
其次,poll()
通过设置一个或多个相应的 revent
位来指示指定文件描述符的问题,并报告该 FD 上的事件(部分通过返回正数)。具体来说,
poll()
sets the POLLHUP, POLLERR and POLLNVAL flag in revents if the condition is true, even if the application did not set the corresponding bit in events
和
A positive [return] value indicates the total number of
pollfd
structures [...] for which therevents
member is non-zero
(POSIX 1003.1-2008;已添加强调)
如果向管道另一端写入的子进程崩溃,您很可能会看到 POLLHUP 事件。如果您的程序以某种方式搞砸了其文件描述符处理,您可能会看到 POLLNVAL 事件,并且您始终必须考虑到 I/O 错误的可能性,该错误 poll()
会发出 POLLERR 信号事件。
因此,为了避免阻塞,您应该仅在 poll()
返回 1 并在文件上的事件中发出 POLLIN 信号时才尝试从管道读取数据。可以想象,您可能会看到它与 POLLERR 或 POLLHUP 一起出现。如果有 POLLERR,我建议中止,但是当管道的写入端在任何进程中不再打开时,预计会出现 POLLHUP,并且这不会使任何仍可读取的数据无效(这将导致由随附的 POLLIN 发出信号)。
关于c - fgetc 在轮询管道后仍然阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46459554/
var status = {{ check_status }}; call_polling = function() { // polling request to API (async)
我有一个网络应用程序,它有一个计时器,每 3 秒触发一次轮询以获取数据。它工作正常大约 2.5 分钟,然后 Chromium 崩溃。 我的请求 Dart 看起来像这样 HttpRequest.getS
是否已经有为 jQuery 编写的通知库?一种提供下拉消息的方式,类似于 StackOverflow 的方式。 寻找的东西: 1)每几秒轮询一次(也许可以选择 cometd ) 2) 有一个标记为已读
当电池电量不足时,Android 将发送一个 ACTION_BATTERY_LOW Intent 。然后当它再次正常时,它会发送 ACTION_BATTERY_OKAY。 不幸的是,如果我的应用程序在
如果在内核模式CPU可以访问用户空间内存,为什么我们在调用poll/select时需要将数据从用户空间复制到内核空间? 引自 Linux 编程接口(interface): When running i
我正在尝试使用来自 python 的 poll() 来轮询一个进程。 link 我不明白,我正在为它提供一个整数值来进行轮询。例如:值为 14870 14870 Traceback (most rec
我正在用 Java 编写一个程序,我在一个线程上打开了 256 个网络连接。每当套接字上有任何数据时,我都应该读取它并进行处理。目前,我正在使用以下方法: while true do itera
我有一个有点哲学的问题。我们使用存储队列来处理“门票”。我们实现的方式是我们有一个后台服务(辅助角色),它轮询存储队列并找出是否有任何票证需要处理。我们所做的工作具有季节性。这意味着不会一直有票需要处
我目前正在使用 CFReadStreamHasBytesAvailable 轮询我的 CFReadStream 以获取新数据。 (首先,一些背景知识:我正在做自己的线程,我不想/不需要搞乱运行循环的东
使用 azure-sdk-for-php 长时间轮询 Azure 队列存储时,如果我的请求间隔超过 30 秒,则库会因以下错误而终止: PHP Notice: fwrite(): send of 2
我在尝试使用 JavaScript 监听 Firebase 中的更改来进行实时刷新时遇到了一些问题。我尝试做的是一个聊天系统。与另一个用户开始新的聊天后,我将加载两个用户之间的所有聊天。 code 我
我正在开发一个使用通知系统的网站(如 Facebook 的系统)。为此,我想我将编写一个 JQuery 轮询函数,使用 ajax 在服务器端查找新通知。 我的问题是,这是个好主意吗? 最佳答案 客户端
我正在开发一个后端服务,该服务使用 spring aws 集成定期轮询 S3 存储桶,并处理来自 S3 的轮询对象。下面是它的实现 @Configuration @EnableIntegration
我想要一些关于如何实现以下内容的建议: 我想让我的用户通过 AJAX 了解在我的服务器上运行的任务的进度。我的服务器运行一个 PHP 脚本,该脚本使用 popen 函数通过 shell 命令下载文件。
我想使用 jQuery 和 AJAX 持续轮询 URL,直到收到 200 状态代码响应。 URL 指向提供文件的 REST API。理想情况下,我会获取其他状态代码,在这些状态代码上我将再次调用 UR
我想知道是否可以将 Ajax 轮询插入到我下面的当前代码中,以便用户每隔几秒发布一次更新,以显示添加到数据库中的任何新内容,例如它们的状态和新的数量添加的评论和我构建的提要中的时间戳。这是我到目前为止
我想弄清楚如何在不使用触发器的情况下轮询对 Oracle 表所做的更改。我目前关心的唯一变化是新的/插入的记录。任何建议将不胜感激。 我也真的不想使用其他表来跟踪更改的内容。 谢谢! 小号 最佳答案
这个问题在这里已经有了答案: How do I return the response from an asynchronous call? (41 个回答) 关闭 3 年前。 我正在尝试轮询 AP
我有一个 SSIS 包,它在 Foreach 容器 中启动另一个 SSIS 包;因为容器在启动它必须启动的所有包后立即报告完成,我需要一种方法让它等到所有“子”包都完成。 所以我实现了一个小的 sle
我将这段代码放入我的主视图文件中: jQuery(document).ready(
我是一名优秀的程序员,十分优秀!