可重入函数与不可重入函数
来源:互联网 发布:高考状元辱骂同胞知乎 编辑:程序博客网 时间:2024/05/29 18:26
- 转自:http://blog.csdn.net/zxj2018/article/details/8012242
- 为了增强程序的稳定性,在信号处理函数中应使用可重入函数。
信号处理程序中应当使用可再入(可重入)函数(注:所谓可重入函数是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错)。因为进程在收到信号后,就将跳转到信号处理函数去接着执行。如果信号处理函数中使用了不可重入函数,那么信号处理函数可能会修改原来进程中不应该被修改的数据,这样进程从信号处理函数中返回接着执行时,可能会出现不可预料的后果。不可再入函数在信号处理函数中被视为不安全函数。
满足下列条件的函数多数是不可再入的:(1)使用静态的数据结构,如getlogin(),gmtime(),getgrgid(),getgrnam(),getpwuid()以及getpwnam()等等;(2)函数实现时,调用了malloc()或者free()函数;(3)实现时使用了标准I/O函数的。The Open Group视下列函数为可再入的:
_exit()、access()、alarm()、cfgetispeed()、cfgetospeed()、cfsetispeed()、cfsetospeed()、chdir()、chmod()、chown()、close()、creat()、dup()、dup2()、execle()、execve()、fcntl()、fork()、fpathconf()、fstat()、fsync()、getegid()、geteuid()、getgid()、getgroups()、getpgrp()、getpid()、getppid()、getuid()、kill()、link()、lseek()、mkdir()、mkfifo()、open()、pathconf()、pause()、pipe()、raise()、read()、rename()、rmdir()、setgid()、setpgid()、setsid()、setuid()、sigaction()、sigaddset()、sigdelset()、sigemptyset()、sigfillset()、sigismember()、signal()、sigpending()、sigprocmask()、sigsuspend()、sleep()、stat()、sysconf()、tcdrain()、tcflow()、tcflush()、tcgetattr()、tcgetpgrp()、tcsendbreak()、tcsetattr()、tcsetpgrp()、time()、times()、 umask()、uname()、unlink()、utime()、wait()、waitpid()、write()。
即使信号处理函数使用的都是"安全函数",同样要注意进入处理函数时,首先要保存errno的值,结束时,再恢复原值。因为,信号处理过程中,errno值随时可能被改变。另外,longjmp()以及siglongjmp()没有被列为可再入函数,因为不能保证紧接着两个函数的其它调用是安全的。
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- 可重入函数与不可重入函数
- openCV无法解析的外部符号-CvSVM、HOGDescriptor
- C函数_fileno了解
- 根据圆心、半径、起始角度终止角度求弧中点
- DNS原理及其解析过程【精彩剖析】
- MAXTNT,一个古老的传说
- 可重入函数与不可重入函数
- C++共享内存类
- 一个老问题VS2008程序发布问题
- 音视频基础知识学习
- window.showModalDialog以及window.open用法简介
- 大学,不需要爱情
- 一位女上司写给自己下属的信
- 菜鸟备忘之shell编程基础
- 几种获得spring里注册Bean的方法