管道打開,都要同時打開寫端與讀端,不然會在open函數産生阻塞!!!
無名管道
pipe•建立
- –int pipe (int fd[2])
- –傳回0表示成功;fd[0]帶回管道出口,fd[1]帶回管道入口;
- –fd[0], fd[1]通過檔案描述符來表示pipe的出口與入口,程序可以從fd[0]讀,并向fd[1]寫。
- – -1,出錯
•銷毀
- –close(fd[0]) 關閉讀端
- –close(fd[1]) 關閉寫端
pipe 程序間通信:
- •通過read/write實作pipe的讀寫。
- •read(fd[0]), 從出口讀;write(fd[1]), 向入口寫。
- •pipe主要用在親緣程序間通信。
- •通常,先建立一個管道,再通過fork()建立子程序,子程序會複制管道。
Pipe操作注意事項:
- 隻有在管道讀端存在時才有意義.否則,向管道中寫入資料的程序将收到核心傳來的SIGPIPE信号,導緻該程序終止.
- 當緩存沒有資料時,讀操作阻塞;當緩存滿時,寫操作阻塞.
- 管道保證不超過PIPE_BUF(一般為4096)個位元組的寫入操作是原子的,或者全部寫入,或者一個都不寫入.
fifo概念:
- 無命名管道是存在于記憶體中的,隻能用于具有親緣關系的程序之間.
- 有名管道可以使互不相關的兩個程序實作彼此通信.
- 這種管道可以通過路徑名來指定,在檔案系統是可見的,管道建立後,兩個程序就可以把它當作普通檔案一樣地讀寫.
- 命名管道是嚴格第按照先進先出規則的,是以又叫FIFO.
- 對管道和FIFO讀總是從開始處傳回,寫總是把資料添加到末尾,不支援lseek操作
fifo 建立與銷毀
- 通過指令建立 mknod fifoname p
- 通過接口建立 int mkfifo( const char * fifoname, mode_t mode)
- –建立完畢後,就可以對fifoname做I/O操作
- 通過指令銷毀 rm fifoname
- 通過接口銷毀 unlink(fifoname)
信号
信号是在軟體層次上對中斷機制的一模拟,是一種異步通信機制.
- 信号可以直接進行使用者空間程序和核心程序之間的互動,核心程序可以利用它來通知使用者空間程序發生了哪些系統事件.
- 信号可以在任何時候發給某一程序,而無需知道該程序的狀态.
- 如果該程序目前并不處于執行狀态,則該信号就由核心儲存起來,直到該程序恢複執行時再傳遞給它.
- 如果一個信号被程序設定為阻塞,則該信号的傳遞被延遲,直到其阻塞被取消時才被傳遞給程序.
•信号來源
信号事件的發生有兩個來源:
- 硬體來源(比如按下了鍵盤或者其它硬體故障),通常由核心進行通知
- 程式可以用kill,sigqueue,alarm, raise ,setitimer 來用觸發信号
- Shell的kill指令也可用來發信号給指定的程序
•信号的用途及含義
- 前32種信号已經有了預定義值,每個信号有了确定的用途及含義,并且每種信号都有各自的預設動作。如按鍵盤的CTRL ^C時,會産生SIGINT信号,對該信号的預設反應就是程序終止。
- 前32一般信号都配置設定特殊意義,使用者自定義的消息,最好選擇 SIGUSR1,SIGUSR2
- 前32個為不可靠信号,如果發現該信号已經在程序中注冊,那麼就忽略該信号(不重複排隊).
- 後32個為可靠信号,不管該信号是否已經在程序中注冊,都會被在注冊一次(重複排隊),是以信号就不會丢失