原创 父進程異步等待子進程

父進程自定義SIGCHLD信號的處理函數,並採用非阻塞方式等待,當子進程退出時,會向父進程發送信號,父進程會進行回收。 當有10個子進程退出時,會給父進程發送10個信號,但由於只會記錄一次,所以只能回收一次,我們讓父進程

原创 二叉樹之紅黑樹迭代器

紅黑事的性質: 1.每個節點不是紅色就是黑色。 2.根節點一定是黑色。 3.沒有兩個連續的紅色節點。 4.每個葉子結點道根的路徑上,黑色結點的個數都相等。 5.每個葉子結點的空指針域都是黑色的。 通過這些條件的設定,可

原创 信號屏蔽與信號遞達

信號遞達(handler):實際執行信號的處理動作, 信號未決(pending):信號從產生到遞達之間的狀態, 信號阻塞(block):被阻塞的信號產生時將保持在未決狀態,直到進程解除對此信號的阻塞,才執行遞達的動作。 【注

原创 AVL樹之插入與判斷

二叉搜索樹是爲了降低遍歷的時間複雜度,但是對於單支情況並不能很好的解決,要遍歷一個左單支或右單支的二叉樹,時間複雜度和鏈表相同,所以就引入了—>AVL樹。 AVL樹和一般的搜索二叉樹相比有什麼不同呢? AVL樹在搜索二叉樹的基

原创 AVL樹的刪除

AVL數的刪除前面的操作和二叉搜索樹的刪除操作相同,只是在刪除時順便修改pParent的平衡因子,在刪除完後,根據pParent的平衡因子,向上調整平衡因子直到平衡。 當pParent->_bf == 0時,需要向上調整; 當

原创 進程通信之管道

管道通信分爲兩種,一種是匿名管道,另一種是命名管道,對於這兩種管道有什麼區別呢? 匿名管道,顧名思義就是沒有名字,他只能讓擁有血緣關係的兩個進程進行通信,它是讓兩個進程分別連接管道的讀端和寫端,將數據保存在該管道內,兩個進程就都

原创 線程死鎖

什麼是死鎖 線程A需要資源X,而線程B需要資源Y,而雙方都掌握有對方所要的資源,這種情況稱爲死鎖。 死鎖產生的4個必要條件是什麼 1.互斥:存在這樣一種資源,它在某個時刻只能被分配給一個執行緒(也稱爲線程)使用; 2.請求與保持

原创 ARP協議

ARP協議 ARP協議叫做地址解析協議,在數據傳送到目標網絡時,源主機需要將數據發送到對應主機,但源主機只知道目標主機的IP地址,不知道MAC地址,而數據包在接收時是先被網卡接受在遞交給上層協議,網卡通過數據包上的MAC地址與主機

原创 可重入函數

重入:是指被兩個或多個執行流重複進入。 假設在鏈表向頭結點_pHead插入節點_Node1時,插入動作分兩步,一是將_Node1->_pNext = _pHead->_pNext,二是_pHead->_pNext = _Node

原创 線程安全

假設一種情況,編寫mysleep()函數。 #include <stdio.h> #include <unistd.h> #include <signal.h> void myhandler(int sig) { prin

原创 匿名管道的四種情況

匿名管道的4種情況: 1.如果所有指向管道寫端的文件描述符都關閉了(管道寫端的引用計數等於0),而仍有進程從管道的讀端讀取數據,那麼管道中剩餘的數據都被讀取後,再次read會返回0,就像讀到文件末尾一樣。 1 #includ

原创 Linux下線程的創建與等待

Linux下的進程是在各自獨立的地址空間中運行,進程間共享數據需要進程間通信機制,這種機制非常不方便,並且有的時候需要一個進程同時執行多個執行流,這時就引入了線程的概念。 線程是在進程的地址空間內部運行的一個執行分支,它們之間共

原创 將二叉搜索樹轉換成鏈表

二叉搜索樹與雙向鏈表的相同點是: 二叉搜索樹右左右指針域,而雙向鏈表也有前去與後繼,這樣只要按照中序遍歷的方法,將二叉樹遍歷一遍,改變原來的左右指針域的指向,就能變成雙向鏈表。 首先將搜索二叉樹寫成迭代器,迭代器的本質就是指針,

原创 端口分類調研

計算機中的進程都是用進程標識符來標誌的,但在網絡環境下,計算機系統所指派的這種進程標識符用來標誌運行在應用層的各種應用進程是不行的。這是因爲在因特網上使用的計算機的操作系統種類很多,而不同的操作系統有使用不同格式的進程標識符。爲了

原创 子進程退出時會給父進程發信號嗎?

父進程創建一個子進程,那麼子進程退出時,會不會告訴父進程它要退出了?其實在子進程退出時,會給父進程發送一個SIGCHLD,17號信號。 那麼下面用代碼來驗證一下: 首先要捕捉SIGCHLD信號,輸出 i am %d signa