linux操作系统之全局异步IO及可重入/不可重入函数
(1)全局變量異步I/O實(shí)現(xiàn)父子進(jìn)程交替數(shù)數(shù)
? ? ? ? ? 1)信號捕捉函數(shù)
? ? ? ? ? ? ? ? ?? ? ? ? ??
? ? ? ? ? ? 2)main函數(shù)實(shí)現(xiàn)信號交替
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ?3)程序?qū)崿F(xiàn)
? ? ? ? ? ? ? ? ? ? ? ? ? ?1》創(chuàng)建子進(jìn)程,父進(jìn)程等待1s,等待子進(jìn)程完成捕捉函數(shù)注冊(捕捉信號SIGUSR1)。父進(jìn)程注冊捕捉函數(shù)(捕捉信號SIGUSR2),父進(jìn)程先執(zhí)行一次捕捉函數(shù),將標(biāo)志位flag置1,等待1s;
? ? ? ? ? ? ? ? ? ? ? ? ? ?2》flag為1時,父進(jìn)程完成數(shù)數(shù),父進(jìn)程給子進(jìn)程發(fā)送SIGUSR1信號,并將flag置0;
? ? ? ? ? ? ? ? ? ? ? ? ? ?3》子進(jìn)程捕捉函數(shù)捕捉到SIGUSR1信號,執(zhí)行捕捉函數(shù),令flag為1,等待1s。子進(jìn)程向父進(jìn)程發(fā)送SIGUSR2,置flag為0;
? ? ? ? ? ? ? ? ? ? ? ? ? ?4》父進(jìn)程捕捉SIGUSR2,執(zhí)行捕捉函數(shù),父進(jìn)程向子進(jìn)程發(fā)送SIGUSR2信號,依次反復(fù)...
? ? ? ? ? ? ? ? ? ? ?4)運(yùn)行結(jié)果
? ? ? ? ? ? ? ? ? ??
? ? ? ? ?5)如果把父子捕捉函數(shù)之間的sleep(1)去掉,則程序可能運(yùn)行出錯
? ? ? ? ? ? ?分析:當(dāng)函數(shù)執(zhí)行完kill(pid,SIGUSR1);給此時若父進(jìn)程失去cpu,則子進(jìn)程執(zhí)行數(shù)數(shù),將flag置1,此時子進(jìn)程給父進(jìn)程發(fā)送SIGUSR2。此時如果父進(jìn)程獲得cpu,此時父進(jìn)程執(zhí)行信號捕捉函數(shù),flag置1,隨后flag置零,程序結(jié)束。
? ? ? ? ? ? ?原因:引入全局變量flag的原因。
(2)可/不可重入函數(shù)
? ? ? ? ? 一個函數(shù)在被調(diào)用執(zhí)行期間(尚未調(diào)用結(jié)束),由于某種時序該程序又被重復(fù)調(diào)用,稱為重入(遞歸調(diào)用)。?
? ? ? ? ? 定義可重入函數(shù):1)不能含有全局變量和static變量,不能使用malloc和free函數(shù)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)信號捕捉函數(shù)為可重入函數(shù)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3)信號處理程序可以調(diào)用的可重入函數(shù)可參閱man 7 signal
? ? ? ? 不可重入函數(shù)大都包含:1)靜態(tài)數(shù)據(jù)結(jié)構(gòu)。2)調(diào)用malloc和free函數(shù)。3)標(biāo)準(zhǔn)的I/O函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的linux操作系统之全局异步IO及可重入/不可重入函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux操作系统之竞态条件(时序竞态)
- 下一篇: 成都大熊猫繁育研究基地坐什么车