Linux下利用信号的异步串口中断响应

2023-05-16

    先悔过一下。因为一个月前就在学习这个,当时解决的差不多了,想着抽个空再记录这些,没想到这么短的时间就已经忘得

差不多了,真是不好,应该趁热打铁。废话不多说了,这里主要介绍在Linux下,利用信号来实现异步的串口中断响应。主要思路

很简单,首先是关联信号,在此是关联处理SIGPOLL;其次是等待指定的信号。
    异步I/O的实现有很多方式,【2】中提了几种,还有较新的epoll,和Poll本质上差不多。但本人当时尚不理解这些,没有明

白select、Poll等的具体做法,也采用了多线程。其实万万不该,由于逻辑处理的不好而导致的程序不可预测性太多,因此不太

同意【2】中的观点,只是用来参考使用了。但我这里讲的做法也是在多线程条件下的异步串口通信。
    Linux下信号的概念、原理以及初步的应用【1】中的上、下已经讲解得非常到位了,仔细读读都能找到自己所需要的。下面

具体记录我的实现过程。
    (1)关联信号。
     首先是利用sigaction函数来将指定的信号与处理函数关联,以及通过fcntl函数确定是在哪个线程中,关联哪个设备文件。

那么先是sigaction函数的原型:int sigaction(int signum,const struct sigaction  *act ,struct sigaction  *oldact);

其中struct sigaction 中的内容意义可以看【3】,
        struct sigaction sact;   
        sigemptyset(&sact.sa_mask);             //一般都先清空关注的信号集
        sact.sa_flags=SA_SIGINFO;  //信号的附加信息传递开关,可以在信号SIGIO上传递附加信息,其实就是

//区别POLL_IN,POLL_OUT,为什么要使用附加信息,自己试试SIGIO信号就知道了,它是读写不加区分的
 sact.sa_sigaction=signal_action; //信号处理函数,由于利用了信号附加信息,函数原型为
//void handler(int signum,siginfo_t *info,void *context);关键是siginfo_t结构体中的si_code,其中存储了POLL_IN等。
//到时候利用info->si_code== POLL_IN或POLL_OUT在串口有读或写时做相应的处理
好了,利用sigaction(SIGPOLL,&sact,NULL);完成信号关联;再通过下面的操作完成指定的设备文件、线程
       fcntl(fd, F_SETOWN, tid);    //tid就是获取的线程号,嵌入式环境下可以使用syscall(SYS_gettid);  
       fcntl(fd, F_SETSIG,SIGPOLL );    //关心SIGPOLL信号
       fcntl(fd,F_SETFL,O_ASYNC|O_NONBLOCK);   //异步的
     (2)等待信号
      其实按照上面的做法,完全可以达到当串口有指定数据时进行相应的处理,只要指定的线程在,信号处理函数将会一直起

作用。另一种做法是在接收线程等待信号的发生,而后做相应的处理,自认为双保险,其实很混乱,只是记下来。注意的是在信

号等待或者屏蔽函数中要区分是对线程起作用的还是作用在进程上的。【1】中和【6】中说了很多,我这里只是用到了在线程中

等待信号传递过来的函数sigwaitinfo(),要是想加上时间限制也可以使用sigtimedwait();函数原型:
int sigwaitinfo(const sigset_t *set,siginfo_t *info);按照man中的说法只有当你指定的信号(在参数set信号集中)被传递到使用这个函数的线程时,该函数返回,并将信号的信息存储到后面的info中,也可以供你使用。
     (3)嵌入式环境下,在编译的时候会遇到【4】中的莫名奇妙的问题,其实加上编译开关选项即可-D_GNU_SOURCE,原因么自己看【5】了。
      好了,就这么多了,其实啥也没说,只是把一些可能用到的提了下,跟着路线走,应该能找到自己需要的了。写得太烂了,谁叫给忘得差不多了!@@@
学习参考文献:
【1】http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
【2】http://blog.csdn.net/boldeagle/archive/2008/10/18/3095930.aspx
【3】http://baike.baidu.com/view/1748537.htm
【4】http://bbs.chinaunix.net/thread-1731238-1-1.html
【5】http://hi.chinaunix.net/?uid-483016-action-viewspace-itemid-42665
【6】《Unix环境高级编程》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下利用信号的异步串口中断响应 的相关文章

  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp

随机推荐