Linux的信号机制与异步通知机制

1.GPIO异步通知机制

//应用程序需要完成如下三个步骤:

(1)signal(SIGIO, sig_handler);

调用signal函数,让指定的信号SIGIO与处理函数sig_handler对应。

(2)fcntl(fd, F_SET_OWNER, getpid());

指定一个进程作为文件的“属主(filp->owner)”,这样内核才知道信号要发给哪个进程。

(3)f_flags = fcntl(fd, F_GETFL);fcntl(fd, F_SETFL, f_flags | FASYNC);

在设备文件中添加FASYNC标志,驱动中就会调用将要实现的test_fasync函数。

三个步骤执行后,一旦有信号产生,相应的进程就会收到。
//驱动的部分
(1)定义结构体fasync_struct。

struct fasync_struct *async_queue;

(2)实现buttons_fasync,把函数fasync_helper将fd,filp和定义的结构体传给内核。

int buttons_fasync (int fd, struct file *filp, int mode)
{
    struct _test_t *dev = filp->private_data;

    return fasync_helper(fd, filp, mode, &dev->async_queue);
}

(3)当设备可写时,调用函数kill_fasync发送信号SIGIO给内核。

if (dev->async_queue){
    kill_fasync(&dev->async_queue, SIGIO, POLL_IN);
}
(4)注册fasync函数
struct file_operations buttons_ops = {
    .open    = buttons_open,
    .read    = buttons_read,
    .release = buttons_close,
    .fasync  = buttons_fasync,
};

 

参考链接:https://www.cnblogs.com/hellokitty2/p/9074631.html

 

2.信号机制

SIGUSR1 用户自定义信号 默认处理:进程终止
SIGUSR2 用户自定义信号 默认处理:进程终止

当一起使用多个信号且是多线程时,由于子线层会继承父线程的信号属性,所以需要在父进程对信号使用pthread_sigmask()来改变或/并获取当前的信号掩码;

    sigset_t new_set;
    sigemptyset(&new_set);
    sigaddset(&new_set,SIGUSR1);

参考链接:1.https://www.cnblogs.com/kex1n/p/8296332.html

                  2.https://blog.csdn.net/tiany524/article/details/17048069

                  3.https://www.cnblogs.com/arnoldlu/p/10185126.html

                  4.http://blog.chinaunix.net/uid-20682890-id-4418497.html

                  5.https://blog.csdn.net/weixin_43133795/article/details/103928464

                  6.https://www.cnblogs.com/my_life/articles/5146192.html

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值