【发布时间】:2011-03-09 23:13:20
【问题描述】:
我正在实现一个使用 sendto() 和 recvfrom() 通过 UDP 进行通信的客户端和服务器。从服务器接收数据时,我想为我的客户端使用 SIGPOLL。我的问题是,在处理程序中,另一个信号到达并且它丢失了。我读过有一个内核变量(一个标志)被设置,我可以在退出处理程序之前检查它,但我似乎无法找出是哪个标志。
void my_receive_server_data(int sig_num)
{
/* execute recvfrom() */
}
主要是:
setup_action.sa_handler = my_receive_server_data;
if (sigaction(SIGPOLL, &setup_action, NULL) == -1)
perror("Sigaction");
if (fcntl(sock, F_SETOWN, getpid()) < 0) {
perror("fcntl");
}
if (fcntl(sock, F_SETFL, O_RDONLY | FASYNC) < 0) {
perror("fcntl");
}
目前,如果我不在服务器中的 sendto() 之后放置 sleep(),则客户端只会执行第一个 sendto()(在处理程序中,作为 recvfrom())。放置 sleep() 可以解决问题,所以我非常相信这是因为处理程序只运行一次(因为它在执行 my_receive_server_data 的同时获取数据)。
我想知道在从 my_receive_server_data 返回之前我应该检查什么标志,以检查在该处理程序执行时是否有任何输入到达。
非常感谢。
【问题讨论】:
-
为什么要使用
SIGPOLL?我认为人们普遍认为这是一个非常糟糕的设计,特别是因为大多数函数不能从信号处理程序中调用,并且SIGPOLL和使用它的接口由于遗留应用程序仅保留在 POSIX 中需要他们。你应该学会使用select或poll并编写一个合适的网络应用程序。 -
@R.. 你有什么资源可以分享一下为什么大多数函数不能从信号处理程序中调用吗?
-
@Matthew:对于 POSIX,请参阅 pubs.opengroup.org/onlinepubs/9699919799/functions/…。对于纯 C,它的限制更大;如果您需要,我可以查找引文。