Unix網絡編程——簡介

1.簡介:

1.IPC 進程間通信方式:1.管道 2.System V 消息隊列 3.Posix消息隊列 4.遠程過程調用

2.保持進程間的同步操作:1.文件系統 2.記錄上鎖 3.System V信號量  4. Posix 信號量 5.互斥鎖  6.讀寫鎖

3.進程間的信息共享:1.穿過內核,訪問文件系統的文件信息  2.共享駐留於內核的信息   3.共享內存區

4.IPC對象的持續性:1.隨着文件系統,2.隨着內核,3.隨着進程持續的

2.Posix IPC:

1.以下三種類型的IPC合稱爲“Posix IPC”,分別是Posix消息隊列、Posix信號量、Posix共享內存區
2.Posix IPC函數彙總:

 

消息隊列

信號量

共享內存區

頭文件

<mqueue.h>

<semaphore.h>

<sys/mman.h>

創建、打開或刪除IPC函數

mq_open

mq_close

mq_unlink

sem_open

sem_close

sem_unlink

shm_open

shm_unlink

sem_init

sem_destory

控制IPC操作的函數

mq_getattr

mq_setattr

 

ftruncate

fstat

IPC操作函數

mq_send

mq_receive

mq_notify

sem_wait

sem_trywait

sem_post

sem_getvalue

mmap

munmap


3.IPC名字:
它必須符合已有的路徑名規則(必須最多由PATH_MAX個字節構成,包括結尾的空字節)。
如果它以斜槓符開頭,那麼對這些函數的不同調用將訪問同一個隊列。如果它不以斜槓符開頭,那麼效果取決於實現。
名字中額外的斜槓符的解釋由實現定義。爲移植起見,必須以一個斜槓開頭,並且不能包含其他的斜槓符。
爲了解決移植性的問題,我們使用了px_ipc_name函數:
#include "unpipc.h"
 
char* px_ipc_name(const char* name)
{
      char* dir,*dst,*slash;
      if((dst = malloc(PATH_MAX))==NULL) return NULL;//分配失敗
      if((dir=getenv("PX_IPC_NAME"))==NULL)
      {//目錄名
          #ifdef POSIX_IPC_PREFIX
               dir = POSIX_IPC_PREFIX;
          #else
               dir = "/tmp/";
          #endif
      }
      slash = (dir[strlen(dir)-1] == '/')?"":"/";
      snprintf(dst,PATH_MAX,"%S%S%S",dir,slash,name);//全路徑名稱
      return dst;
}
4.創建和打開IPC通道:

說明

mq_open

sem_open

shm_open

只讀

O_RDONLY

 

O_RDONLY

只寫

O_WRONLY

 

讀寫

O_RDWR

O_RDWR

若不存在則創建

O_CREAT

O_CREAT

O_CREAT

排他性創建

O_EXCL

O_EXCL

O_EXCL

非阻塞模式

O_NONBLOCK

 

 

若已存在則截短

 

 

O_TRUNC


5.IPC權限:
基於如下信息執行權限測試:

1、  創建時賦予該IPC對象的權限位;

2、  所請求的訪問類型(O_RDONLYO_WRONLYO_RDWR);

3、  調用進程的有效用戶ID、有效組ID以及各個輔助組ID

執行權限測試的步驟:

1、  如果當前進程的有效用戶ID0,那就允許訪問;

2、  在當前的進程的有效用戶ID等於該IPC對象屬主ID的前提下,如果相應的用戶訪問權限位已設置,那就允許訪問,否則就拒絕訪問;

3、  當前進程的有效組ID或它的某個輔助組ID等於該IPC對象的組ID的前提下,如果相應的組訪問權限已設置,那就允許訪問,否則拒絕訪問;

4、  如果相應的其他用戶訪問權限已設置,那就允許訪問,否則拒絕訪問。

3.System V IPC

1.也有類似於上面三種的IPC類型,分別是消息隊列、信號量、共享內存區

2、key_t鍵和ftok函數

  三種類型的IPC使用key_t值作爲他們的名字,頭文件<sys/types.h>把key_t定義爲一個整數,通常是一個至少32位的整數,由ftok函數賦予的。函數ftok把一個已存的路徑和一個整數標識符轉換成一個key_t值,稱爲IPC鍵。函數原型如下:

#include <sys/types.h>#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);  //成功返回IPC鍵,出錯返回-1

3、ipc_perm結構

  內核給每個IPC對象維護一個信息結構,內容跟內核給文件維護的信息類似。Unix下結構信息如下:

struct ipc_perm
{
key_t       key;     /* Key supplied to semget(2) */
uid_t        uid;     /* Effective UID of owner */
gid_t        gid;     /* Effective GID of owner */
uid_t        cuid;    /* Effective UID of creator */
gid_t        cgid;    /* Effective GID of creator */
unsigned short   mode;   /* Permissions */
unsigned short     seq;    /* Sequence number */
};

4、創建與打開IPC通道

  對於key值,有兩種選擇:

(1)調用fotk函數,給它傳遞pathname和id。

(2)指定key爲IPC_PRIVATE,保證會創建一個新的、唯一的IPC對象。

5、標識符重用

  System V IPC 標識符是系統範圍的,不是特定於進程的。ipc_perm結構含有一個名爲seq的變量,是內核爲系統每個潛在的IPC對象維護的計數器,每當刪除一個IPC對象時,內核就遞增相應的槽位號,若溢出則循環到0。這樣避免短時間內重用System V IPC標識符,有助於確保過早終止的服務器重新啓動後不會重用標識符。

6、ipcs和ipcrm程序

  System V IPC的三種類型不是以文件系統中的路徑名標識的,不能使用ls和rm程序查看和刪除。而是同ipcs程序輸出System V IPC特性的各種信息,ipcrm則刪除一個System V 消息隊列、信號量或共享內存區。

ipcs - 分析消息隊列、共享內存和信號量
ipcs [-mqs] [-abcopt] [-C core] [-N namelist]
-m 輸出有關共享內存(shared memory)的信息
-q 輸出有關信息隊列(message queue)的信息
-s 輸出信號量(semaphore)的信息

ipcrm - 刪除ipc(清除共享內存信息)
ipcrm -m|-q|-s shm_id
-m 輸出有關共享內存(shared memory)的信息
-q 輸出有關信息隊列(message queue)的信息
-s 輸出信號量(semaphore)的信息






發佈了67 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章