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函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RDB和AOF速度測試

同一臺機器測試 Redis3.2 Redis5.0.7 Linux python 3.10.0-693.11.1.el7.x86_64 #1 SMP Mon Dec 4 23:52:40 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux rdb測試步驟 1. 修改redis.conf配置文件 開啟rdb(測試aof時,注釋掉rdb,并重啟redis) # save &quo…

LInux操作系統之SIGCHLD信號

(1)SIGCHLD產生條件 1)子進程終止的時候 2)子進程接收到SIGSTOP信號停止時 3)子進程處于停止狀態,接受到SIGCONT后喚醒 (2)借助SIGCHLD使用waitpid信號實現父進程對子進程的回收 &a…

rdb和aof到底哪個快

rdb和aof到底哪個快? 大多數情況rdb比aof快!取決因素是fsync策略 具體選擇aof還是rdb應根據業務場景選擇。糾結于兩者哪個更快意義不大 測試數據 數據量rdb時間rdb文件大小5000076s1.1M100000197s2.1M150000235s3.1M200000305s4.3M 數據量aof時間ao…

linux操作系統之終端

(1)終端分類: AltCtrlF1~F6 字符終端 pts :偽終端 AltCtrlF7 圖形終端 SSH,Telnet 網路終端 (2)終端的啟動流程 每一個進程都可以通過一個特殊的設備文件/dev/tty訪問它的控制終端&#x…

golang實現聊天室(一)

一個簡單的tcp通訊 客戶端發一下,服務端收一下打印 客戶端 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:8888", 30*time.Second)if err ! nil {return}conn.Write([]byte("string not "))conn.Close() }服務端 …

linux操作系統之進程組及會話

(1)進程組(作業):代表一個或多個進程的集合。 1)父進程創建子進程時,默認子進程與父進程屬于同一進程組,進程組id第一個進程id(組長id,父進程id)。 2)使用kill -SIGKILL -進程組id(負數&#xf…

golang實現聊天室(二)

golang實現聊天室(二) 上一篇完成了服務端啟動監聽連接,客戶端建立連接,發一個消息,斷開連接。服務端收一下,然后服務端打印。 客戶端可以一直發送消息,服務端不停接收并打印 client func mai…

golang實現聊天室(三)

golang實現聊天室(三) 實現多個客戶端同時給服務端發送消息,服務端接受并打印出來 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:5888", 30*time.Second)if err ! nil {log.Fatal("conn…

linux操作系統之線程同步及互斥量

(1)線程同步 1)線程同步:指一個線程發出某一個功能運行時,在運行還沒有結束的時候,該調用不返回。同時其它線程為保證數據的一致性,不能調用該功能。 2)多個控制流共同操作一個共享資…

golang實現聊天室(四)

golang實現聊天室(四) 服務端給已經建立連接的客戶端發送消息 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)if err ! nil {log.Fatal("conn error")}for {conn.Write…

linux操作系統之讀寫鎖

(1)讀寫鎖:只有一把鎖,但是有兩種狀態(讀,寫) 1)讀寫鎖的三種狀態:讀鎖,寫鎖,不加鎖 2)讀寫鎖特性(12字)&…

golang實現聊天室(五)

golang實現聊天室(五) 完成服務端廣播消息 server package mainimport ("fmt""log""math/rand""net" )type Client_list struct {list map[net.Conn]string }func main() {client_list : Client_list{make(map…

linux操作系統之條件變量

(1)條件變量 條件變量本身不是鎖,但它可以造成線程阻塞,通常與互斥鎖配合使用。 (2)條件鎖相關函數 pthread_cond_t類型,用于定義條件變量 1)初始化一個條件變量:pthrea…

7. 整數反轉 golang

官解 func reverse(x int) ( num int) {for x ! 0 {num num*10 x%10x x / 10}// 使用 math 包中定義好的最大最小值if num > math.MaxInt32 || num < math.MinInt32 {return 0}return }Me func reverse(x int) int {if x < 0 {return -1 * reverse_fun(-x)} else…

linux操作系統之信號量、互斥量在進程間的同步、文件鎖

&#xff08;1&#xff09;信號量&#xff1a;進化版的互斥量 多個線程間對某個對象的部分數據進行共享&#xff0c;使用互斥鎖是沒有辦法實現的&#xff0c;只能將整個數據對象鎖住。這樣雖然達到了多線程操作數據共享的目的&#xff0c;卻導致線程并發性下降。 信號量&#x…

linux網絡編程之網絡應用設計模式、分層模型、通信過程

&#xff08;1&#xff09;網絡協議 可以理解為規則&#xff0c;其中包含著數據傳輸和數據的解釋。 典型的協議&#xff1a;傳輸層&#xff1a;tcp/udp協議&#xff0c;應用層&#xff1a;http/ftp協議&#xff0c;網絡層&#xff1a;ip協議&#xff0c;網路接口&#xff1a;ar…

680. 驗證回文字符串 Ⅱ golang

題目 驗證回文字符串 Ⅱ 給定一個非空字符串 s&#xff0c;最多刪除一個字符。判斷是否能成為回文字符串。 示例 1: 輸入: “aba” 輸出: True 示例 2: 輸入: “abca” 輸出: True 解釋: 你可以刪除c字符。 注意: 字符串只包含從 a-z 的小寫字母。字符串的最大長度是50000…

linux網絡編程之通信協議格式

好文參考&#xff1a;《網路傳輸的三張表&#xff1a;MAC地址表&#xff0c;ARP緩存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html &#xff08;1&#xff09;數據包封裝 傳輸層及其一下的機制由內核決定&#xff0c;主要負責通訊的具體細節&#xff1b;應用層由用…

88. 合并兩個有序數組 golang

88. 合并兩個有序數組 給你兩個有序整數數組 nums1 和 nums2&#xff0c;請你將 nums2 合并到 nums1 中&#xff0c;使 nums1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。 你可以假設 nums1 有足夠的空間&#xff08;空間大小大于或等于 m …

linux網絡編程之Socket編程

&#xff08;1&#xff09;socket套接字 1&#xff09;在linux環境下&#xff0c;socket用于表示進程間網絡通信的特殊文件類型&#xff0c;其本質是內核借助緩沖區形成的偽文件&#xff08;不占磁盤空間&#xff0c;除此之外還有二進制文件&#xff0c;管道&#xff0c;字符文…