天天看點

最初Unix IPC包括:管道、FIFO、信号 ,

管道打開,都要同時打開寫端與讀端,不然會在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個為可靠信号,不管該信号是否已經在程序中注冊,都會被在注冊一次(重複排隊),是以信号就不會丢失​​​​​​​

繼續閱讀