可重入函数|学习笔记

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

开发者学堂课程【物联网开发- 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");这么写其实不太正规,为了看效果选择了这样写。

相关文章
|
3月前
|
安全 Java C语言
C语言线程解池解读和实现01
C语言线程解池解读和实现01
|
2月前
|
存储 算法 Linux
C语言 多进程编程(一)进程创建
本文详细介绍了Linux系统中的进程管理。首先,文章解释了进程的概念及其特点,强调了进程作为操作系统中独立可调度实体的重要性。文章还深入讲解了Linux下的进程管理,包括如何获取进程ID、进程地址空间、虚拟地址与物理地址的区别,以及进程状态管理和优先级设置等内容。此外,还介绍了常用进程管理命令如`ps`、`top`、`pstree`和`kill`的使用方法。最后,文章讨论了进程的创建、退出和等待机制,并展示了如何通过`fork()`、`exec`家族函数以及`wait()`和`waitpid()`函数来管理和控制进程。此外,还介绍了守护进程的创建方法。
C语言 多进程编程(一)进程创建
|
2月前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
2月前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
4月前
|
调度 C语言
深入浅出:C语言线程以及线程锁
线程锁的基本思想是,只有一个线程能持有锁,其他试图获取锁的线程将被阻塞,直到锁被释放。这样,锁就确保了在任何时刻,只有一个线程能够访问临界区(即需要保护的代码段或数据),从而保证了数据的完整性和一致性。 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含一个或多个线程,而每个线程都有自己的指令指针和寄存器状态,它们共享进程的资源,如内存空间、文件句柄和网络连接等。 线程锁的概念
171 1
|
6月前
|
存储 安全 Linux
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
403 0
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
|
存储 缓存 安全
可重入函数与不可重入函数
可重入函数与不可重入函数
176 0
|
安全 Linux 调度
【Linux系统编程】可重入和不可重入函数
【Linux系统编程】可重入和不可重入函数
199 0
|
Java API 调度
|
存储 安全 C语言
【C语言安全编码之可重入函数】1、可重入函数的基本概念
【C语言安全编码之可重入函数】1、可重入函数的基本概念
273 0
【C语言安全编码之可重入函数】1、可重入函数的基本概念