日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--6.進程間通訊機制( 二 )



如果信號的處理過程被設置成缺省則由核心來應付它 。SIGSTOP信號的缺省處理過程是將當前進程的狀態(tài)改變成為Stopped并運行調度管理器以選擇一個新進程繼續(xù)運行 。SIGFPE的缺省處理過程則是引起core dump并使進程退出 。當然 , 進程可以定義其自身的信號處理過程 。一旦信號產生 , 這個過程就將被調用 。它的地址存儲在sigaction結構中 。核心必須調用進程的信號處理例程 , 具體如何去做依賴于處理器類型 , 但是所有的CPU 必須處理這個問題:如果信號產生時 , 當前進程正在核心模式下運行并且馬上要返回調用核心或者系統(tǒng)例程的進程 , 而該進程處在用戶模式下 。解決這個問題需要操縱進程的堆棧及寄存器 。進程的程序計數器被設置成其信號處理過程的地址 , 而參數通過調用框架或者寄存器傳遞到處理例程中 。當進程繼續(xù)執(zhí)行時 , 信號處理例程好象普通的函數調用一樣 。

Linux是POSIX兼容的 , 所以當某個特定信號處理例程被調用時 , 進程可以設定哪個信號可以阻塞 。這意味著可以在進程信號處理過程中改變blocked屏蔽碼 。當信號處理例程結束時 , 此blocked屏蔽碼必須設置成原有值 。因此 , Linux添加了一個過程調用來進行整理工作 , 通過它來重新設置被發(fā)送信號進程調用棧中的原有blocked屏蔽碼 。對于同一時刻幾個信號處理過程 , Linux通過堆棧方式來優(yōu)化其使用 , 每當一個處理過程退出時 , 下一個處理過程必須等到整理例程結束后才執(zhí)行 。


5.2管道
一般的Linux shell程序都允許重定向 。如

$ ls | pr | lpr


在這個管道應用中 , ls列當前目錄的輸出被作為標準輸入送到pr程序中 , 而pr的輸出又被作為標準輸入送到lpr程序中 。管道是單向的字節(jié)流 , 它將某個進程的標準輸出連接到另外進程的標準輸入 。但是使用管道的進程都不會意識到重定向的存在 , 并且其執(zhí)行結果也不會有什么不同 。shell程序負責在進程間建立臨時的管道 。






圖5.1 管道

在Linux中 , 管道是通過指向同一個臨時VFS inode的兩個file數據結構來實現的 , 此VFS inode指向內存中的一個物理頁面 。圖5.1中每個file數據結構指向不同的文件操作例程向量 , 一個是實現對管道的寫 , 另一個從管道中讀 。

這樣就隱藏了讀寫管道和讀寫普通的文件時系統(tǒng)調用的差別 。當寫入進程對管道寫時 , 字節(jié)被拷貝到共享數據頁面中 , 當讀取進程從管道中讀時 , 字節(jié)從共享數據頁面中拷貝出來 。Linux必須同步對管道的訪問 。它必須保證讀者和寫者以確定的步驟執(zhí)行 , 為此需要使用鎖、等待隊列和信號等同步機制 。

當寫者想對管道寫入時 , 它使用標準的寫庫函數 。表示打開文件和打開管道的描敘符用來對進程的file數據 結構集合進行索引 。Linux系統(tǒng)調用使用由管道file數據結構指向的write過程 。這個write過程用保存在表示管道的VFS inode中的信息來管理寫請求 。

如果沒有足夠的空間容納對所有寫入管道的數據 , 只要管道沒有被讀者加鎖 。則Linux為寫者加鎖 , 并把從寫入進程地址空間中寫入的字節(jié)拷貝到共享數據頁面中去 。如果管道被讀者加鎖或者沒有足夠空間存儲數據 , 當前進程將在管道inode的等待隊列中睡眠 , 同時調度管理器開始執(zhí)行以選擇其它進程來執(zhí)行 。如果寫入進程是可中斷的 , 則當有足夠的空間或者管道被解鎖時 , 它將被讀者喚醒 。當數據被寫入時 , 管道的VFS inode被解鎖 , 同時任何在此inode的等待隊列上睡眠的讀者進程都將被喚醒 。

從管道中讀出數據的過程和寫入類似 。

推薦閱讀