【问题标题】:SIGPOLL (SIGIO) problem: interrupt while executing a handlerSIGPOLL (SIGIO) 问题:执行处理程序时中断
【发布时间】: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 中需要他们。你应该学会使用selectpoll 并编写一个合适的网络应用程序。
  • @R.. 你有什么资源可以分享一下为什么大多数函数不能从信号处理程序中调用吗?
  • @Matthew:对于 POSIX,请参阅 pubs.opengroup.org/onlinepubs/9699919799/functions/…。对于纯 C,它的限制更大;如果您需要,我可以查找引文。

标签: c handler signals


【解决方案1】:

按照您尝试的方式创建一个可靠的系统非常困难。学习使用阻塞调用模型,以及使用select()poll() 进行I/O 多路复用,而不是信号。

如果您打算无论如何都使用信号,请尝试将信号处理程序中的代码减少到最少 - 可能只是通过管道发送一个字节以唤醒休眠的线程或进程,或其他任何东西。

【讨论】:

  • 非常感谢,我理解你的解释,看起来不错,但不幸的是,我必须使用 SIGPOLL(不是我的选择)。我仍然需要知道国旗。
【解决方案2】:

在为SIGPOLL 定义处理程序时,该标志是SA_NODEFER 传递给sigaction。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2016-12-12
    • 1970-01-01
    • 2013-02-21
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多