1. 程式人生 > >201402579 《嵌入式系統程序設計》第七周學習總結

201402579 《嵌入式系統程序設計》第七周學習總結

學習總結 緩沖 多個進程 open 鍵值 spa cnblogs 程序設計 read

本周學習了管道及消息隊列相關的知識。

一、管道

1、有名管道&無名管道

有名管道(named pipe):

  管道可用於具有親緣關系進程間的通信,有名管道,除具 有管道所具有的功能外,它還允許無親緣關系進程間的通信。

無名管道:
  只能用於具有親緣關系的進程之間,大大地限制了管道靈活使用。
  

2、有名管道相關的操作函數

(一)mkfifo()

技術分享

技術分享

技術分享

(二)access()

(1)功能:檢查某個文件的存取方式。
(2)原型: int access(const char *filename, int mode)

(三)open()

技術分享

(四)write()&read()

(1)功能:

write():向管道寫入數據

read():從管道讀取數據
(2)原型:
     ssize_t write(int fd, void buf, size_t count)
     ssize_t read(int fd, void buf, size_t count)
(3)參數:

fd                   文件描述符
buf                  指定存儲器寫入數據/讀出數據的緩沖區
count                指定讀出的字節數

(4)返回值:
  write():
    已寫入字節數:成功
    -1:失敗
  read():
    讀到的字節數:成功
    0:已到文件尾
    -1:失敗

(5)memset()

(1)原型:void memset(void s, int ch, size_t n)
(2)功能:將 s 中當前位置後面的 n 個字節用 ch 替換並返回 s,在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零,可對緩沖區初始化。
(3)參數:

s               可指代某個緩沖區
ch              用來替代的字符
n               替代的字節數

3、有名管道的阻塞&非阻塞

(一)讀進程

(1)若該管道是阻塞打開,且當前FIFO 內沒有數據,則對讀進程而言將一直阻塞到有數據寫入。
(2)若該管道是非阻塞打開,則不論FIFO 內是否有數據,讀進程都會立即執行讀操作。即如果FIFO內沒有數據,則讀函數將立刻返回0。

(二)寫進程

(1)若該管道是阻塞打開,則寫操作將一直阻塞到數據可以被寫入。
(2)若該管道是非阻塞打開而不能寫入全部數據,則讀操作進行部分寫入或者調用失敗。

二、消息隊列

消息隊列是一些消息的列表,用戶可以從消息隊列中添加消息和讀取消息,它與FIFO管道有些相似,它的優勢在於可以實現休息的隨機查詢,比FIFO管道更加靈活。

1、消息隊列相關的函數

(一)msgget()

(1)原型:int msgget(key_t key, int msgflg)
(2)功能:創建或打開消息隊列
(3)頭文件:sys/types.h、sys/ipc.h、sys/shm.h
(4)參數:key :消息隊列的鍵值,多個進程可以通過它訪問同一個消息隊列,其中有個特殊值IPC_PRIVATE。它用於創建當前進程的私有消息隊列

      msgflg :權限標誌位

(5)返回值:
  消息隊列 ID:成功
  -1:出錯

(二)msgsnd()

(1)原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
(2)功能:向消息隊列中添加消息,把消息添加到已打開的消息隊列末尾。
(3)頭文件:sys/types.h、sys/ipc.h、sys/shm.h
(4)參數:

msqid                         消息隊列的隊列ID
msgp                          指向消息結構的指針
msgsz                         消息正文的字節數(不包括消息類型指針變量)
msgflg:
    IPC_NOWAIT                若消息無法立即發送(比如:當前消息隊列已滿),函數會立即返回
    0                         msgsnd 調阻塞直到發送成功為止

(5)返回值:
  0:成功
  -1:出錯

(三)msgrcv()

(1)原型:int msgrcv(int msgid, void *msgp, size_t msgsz, long int msgtyp, int msgflg)
(2)功能:讀取消息,把任一消息從消息隊列中取走。
(3)頭文件:sys/types.h、sys/ipc.h、sys/shm.h
(4)參數:

msqid:消息隊列的隊列IDmsgp 消息緩沖區, 同於msgsnd()函數的msgp msgsz 消息正文的字節數(不包括消息類型指針變量)

若msgtyp=0 接收消息隊列中第一個消息

若msgtyp>0 接收消息隊列中第一個類型為 msgtyp 的消息

若msgtyp<0 接收消息隊列中第一個類型值不小於 msgtyp 絕對值且類型值又最小的消息

msgflg MSG_NOERROR :若返回的消息比 msgsz 字節多,則消息就會截短到 msgsz 字節,且不通知消息發送進程

IPC_NOWAIT :若在消息隊列中並沒有相應類型的消息可以接收,則函數立即返回 0 :

msgsnd()調用阻塞直到接收一條相應類型的消息為止

(5)返回值:
  0:成功
  -1:出錯

(四)msgctl()

(1)原型:int msgctl (int msgqid, int cmd, struct msqid_ds *buf )
(2)功能:控制消息隊列,可以完成多項功能。
(3)頭文件:sys/types.h、sys/ipc.h、sys/shm.h
(4)參數:

msqid 消息隊列的隊列ID cmd 命令參數

IPC_STAT 讀取消息隊列的數據結構 msqid_ds,並將其存儲在 buf 指定的地址中

IPC_SET 設置消息隊列的數據結構 msqid_ds 中的 ipc_perm 域(IPC 操作權限描述結構)值。這個值取自 buf 參數 IPC_RMID 從系統內核中刪除消息隊列 buf 描述消息隊列的 msgqid_ds 結構類型變量

(5)返回值:
  0:成功
  -1:出錯

三、收獲與感悟

學到了管道的定義,明白了了無名管道與有名管道的區別,還有實現兩種管道的讀寫編程操作。學到了信息隊列的定義與含義,消息隊列較之有名管道之間的運用:操作管道與消息隊列的多個函數。阻塞與非阻塞的運用方法。

201402579 《嵌入式系統程序設計》第七周學習總結