为什么我不能从ioctl函数接收SIGPOLL信号?

陈柏霖

我遇到了一个我无法解决的奇怪问题。这是我的代码。

#include <stdio.h>
#include <stropts.h>
#include <signal.h>
#include <sys/types.h>

void handle_signal(int s)
{
    char c = getchar();
    printf("got char '%c'\n");
    if(c == 'q')
    {
        exit(0);
    }
}

int main(int argc, char** argv)
{
    sigset(SIGPOLL, handle_signal);
    ioctl(0, I_SETSIG, S_RDNORM);
    printf("type q to exit");
    while(1);
    return 0;
}

当我运行该程序时,我在终端中键入了字符,但是没有用!!!我无法收到SIGPOLL信号。有人可以给我一些建议吗?顺便说一句,我的操作系统是ubuntu 12.04。

马克西姆·埃格鲁什金

在Linux上,需要在文件描述符上设置O_ASYNC标志和F_SETOWN属性以获取SIGIO信号(的同义词SIGPOLL)。信号处理程序只能调用异步信号安全函数:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <ctype.h>

void handle_signal(int) { // Can only use async-signal safe functions here.
    char msg[] = "got char c\n";
    char* c = msg + (sizeof msg - 3);
    if(1 != read(STDIN_FILENO, c, 1) || !isprint(*c))
        return;
    write(STDOUT_FILENO, msg, sizeof msg - 1);
    if(*c == 'q')
        exit(EXIT_SUCCESS);
}

int main() {
    printf("type q to exit\n");

    signal(SIGIO, handle_signal);
    fcntl(STDIN_FILENO, F_SETFL, O_ASYNC | fcntl(STDIN_FILENO, F_GETFL));
    fcntl(STDIN_FILENO, F_SETOWN, getpid());

    sigset_t mask;
    sigemptyset(&mask);
    for(;;)
        sigsuspend(&mask);

    return EXIT_SUCCESS;
}

您可能还想看看F_SETSIG它可以接收您选择的信号并将更多信息接收到信号处理程序中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能从函数返回Vec <&str>?

为什么我不能从void函数返回void

为什么我不能从异步函数内部“产生”?

为什么我的函数不能从 ngForm 收集用户输入?

为什么我不能从主函数返回更大的值?

为什么我的 Javascript 函数不能从 HTML 运行?

为什么我不能从C中的函数传回链表?

为什么我不能从我的计算属性访问我的数据函数?

为什么我的自定义函数不能从 Python 中的文件编辑器执行?

为什么我不能从函数中更改env.hosts?

为什么我不能从该函数返回通用类型T?

为什么我不能从chrome.downloads.onChanged内部调用函数?

为什么我不能从函数返回显式类型的结果枚举?

为什么我不能从构造函数中调用静态方法?

为什么我不能从kv文件的构造函数中引用self.text_1?

为什么我不能从以下程序中获得最小值(使用函数和数组)

为什么不能从函数返回打印函数?

为什么我不能从我的SSD引导?

为什么我不能从远程访问我的postgres?

为什么不能从函数中获取Pandas细胞的类型?

为什么我既不能从ppa存储库也不能从.deb文件安装audacity?

为什么我不能从该表中删除记录?

为什么我不能从Angular调用ajax调用

为什么我不能从泛型参数访问属性?

为什么我们不能从逆变型再现

为什么我不能从便携式HD启动?

Swift:为什么我不能从覆盖init调用方法?

为什么我不能从NgForm获取表单控件

为什么我不能从mplfinance导入Candlestick_ohlc