可重入函数|学习笔记

简介: 快速学习可重入函数

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频可重入函数】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/11015


可重入函数

 

可重入函数是指函数可以由多个任务并发使用,而不必担心数据错误。将来学到多线程,多线程掉同一个函数的时候,因为多个线程用到同一个建成当中,共同使用建成的资源。

一个函数当中有静态变量,这个建成任务就用这一个静态变量,另外一个线程,另外一个任务也去用这一个静态变量,他们两个任务用的是同一个静态变量,就会相互影响,这样的函数就不是可重入的。

编写可重入函数时注意:

1、不使用(返回)静态的数据、全局变量(除非用信号量互斥)。

2、不调用动态内存分配、释放的函数。如果调入了内存分配和释放的函数,那这个函数就是不可重入的。

3、不调用任何不可重入的函数(如标准I/0函数)。

注:

即使信号处理函数使用的都是可重入函数(常见的可重入函数),也要注意进入处理函数时,首先要保存errno的值,结束时,再恢复原值。因为,信号处理过程中,errno 值随时可能被改变。Erron是由系统定义的全局变量,代表出错的类型。

常见的可重入函数列表:

accept

Access

aio error

alo return

aio suspend

alarm

bind

cfgetispeed efgetospeed cisetispeed

cisetospeed

chdir

chmod

chown

clock gettime close 

connect 

creat 

dup 

dup2 

execle

execve

Exit &_exit

fchmod fchoum 

fcntl

fdatasync fork

fpathconf fstat 

fsync

ftruncate

yelegid

geteuid

getgid

getgroups

getpeername

getpgrp getpid getppid

getsockname getsockopt getuid 

kill 

link 

listen

lseek 

lstat 

Mkdir

 mkfifo

apen

pathconf 

pause

 pipe

 pell

Posix trace event

pselect

raise

read

readlink

recv

recvfrom 

recymsg 

rename 

rndir 

sclect 

sem_post 

send

Sendmsg

Sendto

 setgid setpgid setsid

setsockopt

setuid

shutdown

sigaction sigaddset sigdelset

siqemptyset

sigfillset

siqismember

signal sigpause sigpending sigprocmask sigqueue sigset

sigsuspend sleep 

socket

socketpair

stat

nymlink

syscunf

tedrain

tcflow

tctlush

tegetattr

tcgetpgrp

tcsendbreak

tcsetattr

tesetpgrp 

time

Timer-getoverrun

timer-gettime timer-settime times

unask

uname 

unlink 

utime 

wait

waitpid 

write

信号的回调函数里面,在可重入的函数里面,可以去调表格里面的函数。

不能使用全局变量,不能使用静态变量,不能动态内存分配,释放函数,不能调不可重入函数。

这样写代码其实不是特别的合理了,在信号的回调函数里面调用了 printf,这就造成他是不可重入的了。

printf("in fun2\n");这么写其实不太正规,为了看效果选择了这样写。

相关文章
|
人工智能 数据可视化 机器人
【Python】Python实现五子棋游戏(带可视化界面)【独一无二】
【Python】Python实现五子棋游戏(带可视化界面)【独一无二】
|
Windows
Windows下CMD中文乱码问题解决方法,设置代码页65001后仍然乱码
原文地址: http://blog.csdn.net/u011250882/article/details/48136883 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容。在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集。  如果想正确显示UTF-8
13579 0
|
8月前
|
存储 人工智能 Prometheus
剑指大规模 AI 可观测,阿里云 Prometheus 2.0 应运而生
本文介绍了阿里云Prometheus 2.0方案,针对大规模AI系统的可观测性挑战进行全面升级。内容涵盖数据采集、存储、计算、查询及生态整合等维度。 Prometheus 2.0引入自研LoongCollector实现多模态数据采集,采用全新时序存储引擎提升性能,并支持RecordingRule与ScheduleSQL预聚合计算。查询阶段提供跨区域、跨账号的统一查询能力,结合PromQL与SPL语言增强分析功能。此外,该方案已成功应用于阿里云内部AI系统,如百炼、通义千问等大模型全链路监控。未来,阿里云将发布云监控2.0产品,进一步完善智能观测技术栈。
824 42
|
数据采集 数据可视化 数据挖掘
Python量化炒股常用的Pandas包
Python量化炒股常用的Pandas包
348 7
|
安全 前端开发 测试技术
dapp/swap去中心化交易所系统开发
DApp/Swap去中心化交易所系统基于区块链技术,通过智能合约实现数字资产的去中心化交易。其开发流程涵盖项目规划、智能合约编写与审计、前后端开发、系统测试部署及维护升级等多个环节,需确保系统合规、安全,并提供良好用户体验。同时,建立技术支持与活跃社区,促进用户交流与反馈。
|
存储 安全 Java
什么是 Java 的内存模型?
Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)规范的一部分,它定义了一套规则,用于指导Java程序中变量的访问和内存交互方式。
357 1
网站是什么?怎么样制作网站?
网站就是‌HTML等工具制作的用于展示特定内容相关网页的集合。用户可以通过网站发布信息或提供网站服务。
11714 4
|
Kubernetes jenkins 持续交付
从代码到部署微服务实战(一)
从代码到部署微服务实战(一)
使用delve调试golang
使用delve调试golang
234 0
|
JavaScript 算法 Windows
95% emitting CompressionPlugin ERROR Error: error:0308010C:digital envelope routines::unsupported
95% emitting CompressionPlugin ERROR Error: error:0308010C:digital envelope routines::unsupported
1473 0