linux操作系统之全局异步IO及可重入/不可重入函数

(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函数。

猜你喜欢

转载自blog.csdn.net/xx18030637774/article/details/82289089