(1)全局变量异步I/O实现父子进程交替数数
1)信号捕捉函数
2)main函数实现信号交替
3)程序实现
1》创建子进程,父进程等待1s,等待子进程完成捕捉函数注册(捕捉信号SIGUSR1)。父进程注册捕捉函数(捕捉信号SIGUSR2),父进程先执行一次捕捉函数,将标志位flag置1,等待1s;
2》flag为1时,父进程完成数数,父进程给子进程发送SIGUSR1信号,并将flag置0;
3》子进程捕捉函数捕捉到SIGUSR1信号,执行捕捉函数,令flag为1,等待1s。子进程向父进程发送SIGUSR2,置flag为0;
4》父进程捕捉SIGUSR2,执行捕捉函数,父进程向子进程发送SIGUSR2信号,依次反复...
4)运行结果
5)如果把父子捕捉函数之间的sleep(1)去掉,则程序可能运行出错
分析:当函数执行完kill(pid,SIGUSR1);给此时若父进程失去cpu,则子进程执行数数,将flag置1,此时子进程给父进程发送SIGUSR2。此时如果父进程获得cpu,此时父进程执行信号捕捉函数,flag置1,随后flag置零,程序结束。
原因:引入全局变量flag的原因。
(2)可/不可重入函数
一个函数在被调用执行期间(尚未调用结束),由于某种时序该程序又被重复调用,称为重入(递归调用)。
定义可重入函数:1)不能含有全局变量和static变量,不能使用malloc和free函数。
2)信号捕捉函数为可重入函数。
3)信号处理程序可以调用的可重入函数可参阅man 7 signal
不可重入函数大都包含:1)静态数据结构。2)调用malloc和free函数。3)标准的I/O函数。