- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据我的研究,您可以添加一个 epoll 文件描述符来轮询、选择或另一个 epoll,如果事件可用,它将返回 POLLIN。根据 epoll(7):
Q3 Is the epoll file descriptor itself poll/epoll/selectable?
A3 Yes. If an epoll file descriptor has events waiting, then it will
indicate as being readable.
这在我的测试中有效。但是,我现在正尝试将 O_ASYNC 应用于我的 epoll fd,以便它会在事件准备就绪时引发 SIGIO:
//Epoll setup code - trySc runs perror on the string and exits if the function returns -1
int epollFd = epoll_create1(EPOLL_CLOEXEC);
trySc(epollFd, "epoll_create1");
trySc(fcntl(epollFd, F_SETOWN, getpid()), "fcntl F_SETOWN");
trySc(fcntl(epollFd, F_SETSIG, SIGIO), "fcntl F_SETSIG");
int oldFlags = fcntl(epollFd, F_GETFL, 0);
trySc(oldFlags, "fcntl F_GETFL");
trySc(fcntl(epollFd, F_SETFL, oldFlags | O_ASYNC), "fcntl F_SETFL");
//Set up SIGIO and get a socket fd, you don't need to see this
//All my handler does is exit - it's a definite method of knowing SIGIO was raised
struct epoll_event event = {
.events = EPOLLIN | EPOLLET,
.data.fd = socketFd
};
trySc(epoll_ctl(epollFd, EPOLL_CTL_ADD, socketFd, &event), "epoll_ctl");
//Then connect
while(1){
struct pollfd pfd = {
.fd = epollFd,
.events = POLLIN
};
//This blocks until I write something to the socket. Then it enters an infinite loop.
printf("Returning to main(), poll = %d\n", poll(&pfd, 1, -1));
}
当我这样做时,它不会为 epoll 中的新事件引发 SIGIO。 Poll 表明 epollFd 中有事件就绪,但它应该首先引发 SIGIO(它只是检查事件是否在 epollFd 中并退出)。我知道我可以将 O_ASYNC 应用于套接字(我也试过这个)但我希望在我的事件中包含数据。 Epoll 让我这样做。
这是我的完整代码:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <fcntl.h>
#include <netdb.h>
#include <poll.h>
#include <signal.h>
#include <errno.h>
void handleSIGIO(int, siginfo_t *, void *);
const struct sigaction saSIGIO = {
.sa_sigaction = handleSIGIO,
.sa_flags = SA_SIGINFO
};
const struct addrinfo hints = {
.ai_flags = AI_PASSIVE,
.ai_family = AF_INET,
.ai_socktype = SOCK_STREAM
};
void trySc(int err, const char *msg){
if(err != -1) return;
perror(msg);
exit(errno);
}
int main(){
signal(SIGPIPE, SIG_IGN);
trySc(sigaction(SIGIO, &saSIGIO, NULL), "sigaction");
int epollFd = epoll_create1(EPOLL_CLOEXEC);
trySc(epollFd, "epoll_create1");
trySc(fcntl(epollFd, F_SETOWN, getpid()), "fcntl F_SETOWN");
trySc(fcntl(epollFd, F_SETSIG, SIGIO), "fcntl F_SETSIG");
int oldFlags = fcntl(epollFd, F_GETFL, 0);
trySc(oldFlags, "fcntl F_GETFL");
trySc(fcntl(epollFd, F_SETFL, oldFlags | O_ASYNC), "fcntl F_SETFL");
int socketFd = socket(AF_INET, SOCK_STREAM, 0);
trySc(socketFd, "socket");
struct addrinfo *servinfo;
trySc(getaddrinfo("127.0.0.1", "5000", &hints, &servinfo),
"getaddrinfo");
struct epoll_event event = {
.events = EPOLLIN | EPOLLET,
.data.fd = socketFd
};
trySc(epoll_ctl(epollFd, EPOLL_CTL_ADD, socketFd, &event), "epoll_ctl");
trySc(connect(socketFd, servinfo->ai_addr, servinfo->ai_addrlen),
"connect");
printf("Connected\n");
while(1){
struct pollfd pfd = {
.fd = epollFd,
.events = POLLIN
};
printf("Returning to main(), poll = %d\n", poll(&pfd, 1, -1));
}
}
void handleSIGIO(int sn, siginfo_t *info, void *ctx){
printf("SIGIO called\n");
struct epoll_event event;
if(epoll_wait(info->si_fd, &event, 1, 0) != 1){
printf("Warning: no event available\n");
return;
}
printf("Event raised for fd %d\n", event.data.fd);
exit(0);
}
编辑:根据this website ,我正在尝试做的应该有效:
Note that an epoll set descriptor can be used much like a regular file
descriptor. That is, it can be made to generate SIGIO (or another signal)
when input (i.e. events) is available on it; likewise it can be used with
poll() and can even be stored inside another epoll set.
最佳答案
经过更多研究,我发现这是不可能的。根据open(2)
O_ASYNC
Enable signal-driven I/O: generate a signal (SIGIO by default, but this can be changed via fcntl(2)) when input or output becomes possible on this file descriptor. This feature is available only for terminals, pseudoterminals, sockets, and (since Linux 2.6) pipes and FIFOs. See fcntl(2) for further details. See also BUGS, below.
我真的希望我可以将 epoll 与 SIGIO 一起使用。我会找到我能做的其他事情。
我找到了这个问题的解决方案:将 O_ASYNC
应用于每个套接字,然后在您的 SIGIO 处理程序中,在您的 epoll fd 上调用 epoll_wait
。然后像往常一样处理来自 epoll 的事件。它不适用于不支持 SIGIO 的 FD,即使它们支持 epoll,但它适用于套接字和管道,这可能是异步 IO 最常见的用法。
关于c - epoll 事件不会引发 SIGIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47764803/
我正在使用 SharePoint Online 并使用 Windows Azure 托管访问 SPO 的进程。 我们已将启动任务添加到 Azure 角色以安装 http://www.microsoft
我有一个函数,它获取包含时间的源文件(csv 文件),读取它,然后按顺序对行进行排序并将它们写入目标文件中。但是,如果源 csv 文件不存在,我需要引发 FileNotFoundError。我之前曾引
我试图在目录不存在时引发错误,然后再打开该目录中的文件。根据this response我应该为我的问题使用最具体的异常构造函数,我认为它是 NotADirectoryError。但是运行下面的代码我得
在编码/开发生命的一天或另一天,我们确实遇到了这个特殊的情况,这是最常见的异常(exception)之一。我的问题是关于的而不是。为什么(我知道当我们尝试访问实际上指向null的引用变量的属性时会引发
我想知道在 python 中是否可以在一个 except block 中引发异常并在稍后的 except block 中捕获它。我相信其他一些语言默认会这样做。 这是它的样子" try: som
我有以下代码: br = mechanize.Browser() br._factory.is_html = True br.form = mechanize._form.ParseString(''
我刚刚发现,如果您有一个引发 TOO_MANY_ROWS 异常的 SELECT INTO,该变量仍会从查询检索到的第一条记录中分配值。这是预期的行为吗? 这是我的例子: for co in my_cu
当 SSH 显示 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 我知道当您重新安装远程服务器时会发生这种情况,但我尝试列出 其他原因 . 我知道如何
我有一个枚举和一个 EnumMap . 我将 map 放入一个类中以隐藏“字节”值。所以我有一个set(Parameter, int)和set(Parameter, boolean)方法。 publi
在什么情况下会redis-py引发以下 AttributeError 异常? redis-py 不是设计来引发仅基于 redis.exceptions.RedisError 的异常吗? 什么是合理的处
可悲的是,对此异常的引用通常具有异国情调,并且可能发生在您例如通过 Assembly.GetTypes() 枚举类型- 举个例子,它发生在我们的一个部署上,但同一组程序集在集成服务器上运行良好。 为了
我正在为 Android 下的特定平板电脑克隆一个存储库并获取源代码,我必须执行一个 python 脚本。当我执行它时,我收到此错误消息: Traceback (most recent call la
首先,执行此操作(在运行 4.4.2 的 Nexus 5 上测试): 将 PRIORITY_LOW 通知传递给 Service.startForeground()。 观察通知不显示在状态栏中。 使用相
我尝试使用 AppEngine 的 python 模块 api 来获取使用基本缩放的模块的实例数。在我模块的 yaml 文件中,我明确设置了 max_instances 参数。我希望 get_num_
当我如下运行我的 spark python 代码时: import pyspark conf = (pyspark.SparkConf() .setMaster("local")
在我的系统上,一段适用于 Python 2 的代码不适用于 Python 3。 f = open("plotwidget.svg") svgData = f.read() xml_stream = Q
我是 PHP 和 SQL 的新手,但我正在创建一个登录系统。我遇到的问题是: You have an error in your SQL syntax; check the manual that c
我有一个使用 ebaysdk 库的 python 代码,当我运行代码并输入关键字进行搜索时,我得到了这个错误。 Traceback (most recent call last): File "eba
当我将表单数据发送到我的 Flask 应用程序时,出现以下错误。它说它将使用 UTF-8 编码,但语言环境已经是 UTF-8。这个错误是什么意思? /home/.virtualenvs/project
在python2.7中,跟随pympler example : from anotherfile import somefunction, somecustomclass from os import
我是一名优秀的程序员,十分优秀!