本週學習了進程間通信這一章,首先管道:
管道是基於文件描述符的通信方式,當一個管道建立時,它會創建兩個文件描述符 fds[0]和 fds[1],其中 fds[0]
固定用於讀管道,而 fd[1]固定用於寫管道,如圖所示,這樣就構成了一個半雙工的通道。
無名管道,它具有如下特點。
它只能用於具有親緣關係的進程之間的通信(也就是父子進程或者兄弟進程之間)。
它是一個半雙工的通信模式,具有固定的讀端和寫端。
管道也可以看成是一種特殊的文件,對於它的讀寫也可以使用普通的 read()和 write()等函數。但
是它不是普通的文件,並不屬於其他任何文件系統,並且只存在於內核的內存空間中。
有名管道:
FIFO 是嚴格地遵循先進先出規則的,對管道及 FIFO 的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾,它們不支持如 lseek()等文件定位操作。
有名管道的創建可以使用函數 mkfifo(),該函數類似文件中的 open()操作,可以指定管道的路徑和打開的
模式。
創建管道成功之後,就可以使用 open()、 read()和 write()這些函數了
( 1)對於讀進程。
若該管道是阻塞打開,且當前 FIFO 內沒有數據,則對讀進程而言將一直阻塞到有數據寫入。
若該管道是非阻塞打開,則不論 FIFO 內是否有數據,讀進程都會立即執行讀操作。即如果 FIFO
內沒有數據,則讀函數將立刻返回 0。
( 2)對於寫進程。
若該管道是阻塞打開,則寫操作將一直阻塞到數據可以被寫入。
若該管道是非阻塞打開而不能寫入全部數據,則讀操作進行部分寫入或者調用失敗。
open():打開函數;read()讀取函數;write()寫函數;close()關閉函數;
讀進程:
若管道是阻塞打開,且當前FIFO內沒有數據,則對讀進程而言將一直阻塞到有數據寫入。
若該管道是非阻塞打開的,則不論FIFO內是否有數據,讀進程都會立即執行讀操作。即如果FIFO內沒有數據,則讀函數講立即返回0;
寫進程:
若該管道是阻塞打開,則寫操作講一直阻塞到數據可以被寫入;
若改管道是非阻塞打開而不能寫入全部數據,則讀操作進行部分寫入或調用失敗。
消息對列:消息對列的實現包括創建或打開對列、添加信息、讀取信息、控制信息4種操作。
msgget():創建或打開對列,創建的消息對列數量會收到系統消息對列的限制;
msgsnd():添加函數,把消息添加到已打開消息對列末尾;
msgrcv():讀取函數,把消息從消息對列種取走,可以指定取走某一種消息;
msgctl():控制函數,可以完成多項功能;