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