unix 环境高级编程 信号二 可重入函数与不可重入函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

场景描述:

         在捕捉到信号时,不论进程的主控制流程执行到哪里,在未设计信号阻塞时,都会先跳到信号处理函数中去执行,从信号处理函数返回后再继续执行主控制流程,信号处理函数是一个单独的控制流程,因为它和主控制流程是异步的,两者不存在调用与被调用的关系,并且使用不同的堆栈空间,引入了信号处理函数使得一个进程具有多个控制流程,如果这些控制流程访问相同的全局资源(全局变量,硬件资源),则可能会发生冲突(导致全局变量在信号处理函数中被错误的修改等)

什么叫做重入:

         举个例子来说,在主控制流程中调用了fun()函数,但是在执行fun函数的代码段中间时,被某个信号中断,转去执行信号处理函数,在信号处理函数中又去调用fun()函数,这个叫做重入。也就是说一个函数在不同的控制流程中被同时调用,在一个控制流程中该函数尚未返回时,在另外的控制流程中该函数又被调用。  

 什么是可重入函数:

         一个函数可以被多个任务或者是多个控制流程并发的访问,而不用担心数据错误或者是执行的结果具有可预见性。典型的情况就是函数仅使用局部变量,这个时候在不同的控制流程中调用相同的函数,会在栈空间中维护局部变量而非堆空间中,这样改变的数据也仅仅是当时正在执行的函数的数据,当函数执行完之后栈空间释放,当然不会影响到另外的控制流程中的同一个函数

什么叫做不可重入函数:

         把上面的可重入函数的概念改改就行了。或者是这样理解也行:如果函数在重入条件下使用了未受保护的全局资源,则称为不可重入函数

为使我们自己写的函数成为可重入的,应该:

          不在函数中使用静态变量或者是全局变量 

          不返回全局或者是静态数据,所有的数据都由函数的调用者提供

          使用本地变量,即使使用全局变量,也使用全局变量的本地拷贝

          使用全局数据时,加锁保护

          不调用不可重入函数。

不可重入函数除了上诉相反的条件外,还有:

         函数调用了malloc()或者是free()

         函数调用了标准I/O函数(很多的标准I/O函数都以不可重入的方式使用了全局数据结构,比如隶属于进程的缓冲区)

个人认为其实可重入函数的前几条说的都是一件事,尽量不要使用堆中的数据。因为堆中的数据可以被共享。                                              

         apue中关于不可重入函数的例子举得是getpwnam()这个函数,原因在于这个函数会返回静态的数据结构。这样如果在一个控制流程进程getpwnam的调用的时候被中断执行,在另外的控制流程中调用getpwnam函数,则可能出现问题,因为静态类型的变量会在函数调用中维持其值。

        注意:本人非科班出身,学习apue纯属 个人爱好,希望多加指正不足之处。






 


unixunix环境高级编程 一 创建 ⑴线程命名规则 nioEventLoop-1-XX -1指的是线程池 -XX在group中的loop 创建并保存线程执行器 创建mpscQueue异步任务队列 创建线程选择器,循环nioEventLoop数组 启动 1.服务端启动绑定端口 2.新连接接入 三 执行 一个普通任务队列 一个定时任务队列 任务聚合时会把定时任务队列拉去到普通任务队列,保证串行无锁化 四 亮点 ⑴ ⑵ha... 阅读详情

相关推荐

不可重入函数总结

1.malloc,free, printf均是不可重入函数(意味不能在中断函数信号处理函数同时调用),但是线程安全函数(意味它可以被多个线程调用) 2.函数有static变量,则该函数不可重入函数 满足下面条件之一的多数是不可重入函数: (1)使用了静态数据结构; (2)调用了malloc或free; (3)调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全

学海无涯,回头是岸........ 6149

详解可重入函数不可重入函数

详解函数可重入性;详解可重入函数不可重入函数;如何设计可重入函数

wangyx1234的博客 7605

不可重入函数 可重入函数

不可重入函数不可以在它还没有返回就再次被调用;该函数在被调用还没有结束之前,再次被调用,从而可能产生错误。 但是,可重入函数不存在这样的问题。 不可重入函数在实现时通常使用了全局的资源(eg. 全局变量),在多线程的环境下,如果没有很好的处理数据保护互斥访问,就可能会发生错误。 常见的不可重入函数有: 函数 --- 全局资源 printf --- 引用全局变量stdout; ma

1325

C语言之可重入函数 不可重入函数

  可重入函数       在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入函数的话, 那么不同任务调用这个函数时可能修改其他任 务调用这个函数的数据,从而导致不可预料的后果。 那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会 出错。 不可重入函数在实时系统设计中被视为不安全函数。   满足...

一个人的旅行的博客 8318

C语言之可重入函数 && 不可重入函数

可重入函数 在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入函数的话,那么不同任务调用这个函数时可能修改其他任 务调用这个函数的数据,从而导致不可预料的后果。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。 满足...

624

Linux信号编程实践(信号发送函数可重入函数

在早期的UNIX信号不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点。 现在Linux 在SIGRTMIN实时信号之前的都叫不可信号,这里的不可靠主要是不支持信号队列,就是当多个信号发生在进程中的时候(收到信号的速度超过进程处理的速度的时候),这些没来的及处理的信号就会被丢掉,仅仅留下一个信号。 可靠信号是多个信号发送到进程的时候(收到信号

NK_test的博客 2898

可重入不可重入

可重入不可重入 Posted on 2009-07-05 12:00 Prayer 阅读(326) 评论(0)  编辑 收藏 引用 所属分类: C/C++ 、LINUX/UNIX/AIX 这种情况出现在多任务系统当中,在任务执行期间捕捉到信号并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断。如果从信号处理程序返回,则继续执行进程断点处的正常指令序列,从重新

1060

Linux系统编程——信号的基本概念(信号产生于处理、可靠信号可重入函数、SIGCHLD)

信号UNIXLinux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。信号是软中断,通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。一个完整的信号周期包括三个部分:信号的产生,信号在进程中的注册,信号在进程中的注销(由内部机制完成),执行信号处理函数。如下图所示:重点是信号的产生处理。

qq_74811378的博客 1135

UNIX 环境高级编程》学习笔记——信号

UNIX环境高级编程——信号引言信号概念函数 signal不可靠的信号中断的系统调用可重入函数可靠信号术语语义函数 kill raise函数 alarm pause信号函数 sigprocmask函数 sigpending函数 sigaction函数 sigsuspend函数 abort函数 sleep、nanosleep clock_nanosleep函数 sigqueue 引言 信号概念 - SIGABRT abort产生 - SIGALRM alarm设置的时间到达 - SIGCHLD

weixin_45243288的博客 679

Unix环境高级编程-学习-11-信号之初识

本文介绍Unix环境高级编程-信号,包含信号宏、信号函数信号DEMO等,又多学会一点,勤能补拙,继续加油吧。

qq_45111959的博客 867

Unix高级IO之多线程编程 ——可重入函数不可重入函数

定义    可重入:主要用于多任务环境中,一个可重入函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误 不可重入:由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。 编写可重入函数        

kiven12的专栏 505

函数可重入不可重入

https://www.ibm.com/developerworks/cn/linux/l-reent.html这是一篇描述重入函数不可重入函数的文章。先把他copy过来: 在早期的编程中,不可重入性对程序员并不构成威胁;函数不会有并发访问,也没有中断。在很多较老的 C 语言实现中,函数被认为是在单线程进程的环境中运行。 不过,现在,并发编程已普遍使用,您需要意识到这个缺陷。本文描述了在并行

echo_bright_的博客 8092

【线程】synchronized的可重入

文章目录前言1. 线程安全可重入性1.1. 线程安全1.2. 可重入1.2.1. 定义1.2.1.1 产生背景,操作系统的重入函数概念1.2.2. 可重入的条件1.3. 可重入线程安全的关系2. synchronized的可重入性2.1. synchronized是可重入锁2.2. synchronized可重入锁的实现3.总结 前言 从Java多线程:线程间通信之volatilesychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synch

m0_45406092的博客 3122

volatile、可重入不可重入函数以及SIGCHILD信号

main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的 时候,因 为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换 到sighandler函 数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的 两步都做完之后从 sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续 往下执行,先前做第一步 之后被打断,现在继续做完第步。

JDSZGLLL的博客 471

UNIX环境高级编程》读书笔记11: 信号

在多线程环境中应使用。

2198

linux可重入、异步信号安全线程安全

可重入函数

少想多做 3415

使用可重入函数进行更安全的信号处理

在早期的编程中,不可重入性对程序员并不构成威胁;函数不会有并发访问,也没有中断。在很多较老的 C 语言实现中,函数被认为是在单线程进程的环境中运行。 不过,现在,并发编程已普遍使用,您需要意识到这个缺陷。本文描述了在并行并发程序设计中函数不可重入性导致的一些潜在问题。信号的生成处理尤其增加了额外的复杂性。由于信号在本质上是异步的,所以难以找出当信号处理函数 触发某个不可重入函数时导致的

cws1214的专栏 786

可重入函数列表

   10.6. Reentrant FunctionsWhen a signal that is being caught is handled by a process, the normal sequence of instructions being executed by the process is tempora

primer2006的专栏 4565

1 Studying《Unix环境高级编程

启用进程会计选项后,当进程结束后内核会写一个会计记录。会计记录一般包括命令名,使用的CPU时间总量,用户ID,组ID启动时间等。root用户可以执行accton命令来启用会计处理。会计记录邪道指定的文件中,linux中该文件是/var/account/pacct。

u012906122的专栏 993
上一篇: unix 环境高级编程之信号一 概念
下一篇: unix 环境高级编程 信号三态
crazy_programmer_p
博客等级 码龄12年 21粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值