博客
关于我
Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知...
阅读量:789 次
发布时间:2023-02-02

本文共 1420 字,大约阅读时间需要 4 分钟。

信号机制是UNIX系统中最为古老的进程间通信机制,能够产生多种信号。信号的产生主要有以下几种情况:

  • 用户按下某些按键时,会产生信号。
  • 硬件异常产生信号,例如除数为0、无效的存储访问等,内核会产生相应的信号通知进程。
  • 进程使用kill函数将信号发送给其他进程。
  • 用户使用kill命令将信号发送给其他进程。
  • 常见的信号类型包括:

    • SIGHUP:从终端发出的结束信号。
    • SIGINT:来自键盘的中断信号(Ctrl + C)。
    • SIGKILL:结束接收信号的进程。
    • SIGTERM:由kill命令发出的信号。
    • SIGCHLD:标识子进程停止或结束的信号。
    • SIGSTOP:来自键盘(Ctrl + Z)或调试程序的停止执行信号。

    信号处理主要有三种方式:

  • 忽略信号(大多数情况)。
  • 执行用户定义的处理函数。
  • 执行系统默认动作(通常是终止进程)。
  • killraise是发送信号的主要函数:

    • kill可以向自身或其他进程发送信号。
    • raise只能向自身发送信号。

    kill函数的pid参数有四种情况:

  • pid > 0:发送给特定进程ID的进程。
  • pid = 0:发送给同组的进程。
  • pid < 0:发送给进程组ID等于|pid|的进程。
  • pid = -1:发送给所有进程。
  • alarm函数用于设置闹钟时间,时间到时会产生SIGALRM信号。如果未捕捉,默认动作是终止进程。

    pause函数使进程挂起,直到捕捉到信号。signal函数用于注册信号处理函数,有三种处理方式:

  • 忽略信号(SIG_IGN)。
  • 按照系统默认方式处理(SIG_DFL)。
  • 调用用户定义的处理函数。
  • 实例测试:

    #include 
    #include
    #include
    void my_func(int sign_no) { if (sign_no == SIGINT) { printf("I have get SIGINT\n"); } else if (sign_no == SIGQUIT) { printf("I have get SIGQUIT\n"); }}int main() { printf("Waiting for signal SIGINT or SIGQUIT\n"); signal(SIGINT, my_func); signal(SIGQUIT, my_func); pause(); exit(0);}

    测试方法:

  • 在终端运行上述程序。
  • 使用kill -s SIGQUIT + PID发送信号,观察输出结果。
  • 按键驱动异步通知:

  • 应用程序注册信号处理函数signal(SIGIO, my_signal_fun)
  • 在中断处理函数buttons_irq中调用kill_fasync函数。
  • 驱动程序设置文件描述符的 SIGNAL Notifications。
  • 驱动程序实现关键步骤:

  • 支持F_SETOWN命令。
  • 实现F_SETFL命令处理,调用fasync函数。
  • 调用kill_fasync函数发送信号。
  • 总结:支持异步通知需要完成以下工作:

  • 设置filp->f_owner为目标进程ID(由内核完成)。
  • 实现fasync函数,处理FASYNC标志改变。
  • 调用kill_fasync函数,发送相应信号。
  • 转载地址:http://trwfk.baihongyu.com/

    你可能感兴趣的文章
    Linux-网络配置
    查看>>
    Linux-通过XShell使用sz命令提示找不到
    查看>>
    Linux-部署应用到生产环境Tomcat项目-全流程(图文教程)
    查看>>
    Linux-重启与压缩命令
    查看>>
    Linux.BackDoor.Chikdos/Elknot Attack And Defense Analysis
    查看>>
    Linux/CentOS环境下如何安装和配置PhantomJS工作环境
    查看>>
    Linux/CentOS设置全局代理(http)
    查看>>
    Linux/Unix中使用iconv进行编码转换
    查看>>
    Linux/Unix工具与正则表达式的POSIX规范
    查看>>
    Linux/UNIX数据文件和信息系统
    查看>>
    Linux/Windows上Jenkins + Maven + Git的安装
    查看>>
    Linux0.11内核--几种地址(逻辑地址、线性地址、物理地址)的含义
    查看>>
    Linux20系统怎么链接WiFi,在Deepin 20系统下安装Linux图形无线Wi-Fi扫描器LinSSID
    查看>>
    Linux3 在VMware中搭建CentOS6.5虚拟机
    查看>>
    Linux5
    查看>>
    Linux7/Centos7新特性之链路聚合
    查看>>