linux 共享內存--System V共享內存

1)用ftok()函數得到一個ID號. 應用說明: 在IPC中,咱們常常用用key_t的值來建立或者打開信號量,共享內存和消息隊列。這個在IPC的環境中十分的重要,好比說,服務器建立了一個消息隊列,等待客戶機發送請求。那麼如何建立或者打開已有的消息隊列呢?通常而言,咱們對於服務器使用的路徑和項目id(proj_id)是已知的,因此客戶機能夠獲取相同的key來打開 消息隊列並進行操做。 函數原型: # include <sys/types.h> # include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id); Keys: 1)pathname必定要在系統中存在 2)pathname必定是使用進程可以訪問的 3)proj_id是一個1-255之間的一個整數值,典型的值是一個ASCII值。 當成功執行的時候,一個key_t值將會被返回,不然-1被返回。咱們可使用errno來肯定具體的錯誤信息若是咱們很懶惰的話,不妨就使用perror函數來打印對應的出錯字符信息。 2)shmget()用來開闢/指向一塊共享內存的函數 應用說明: shmget()用來得到共享內存區域的ID,若是不存在指定的共享區域就建立相應的區域。 函數原型: #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); key_t key 是這塊共享內存的標識符。若是是父子關係的進程間通訊的話,這個標識符用IPC_PRIVATE來代替。可是剛纔咱們的兩個進程沒有任何關係,因此就用ftok()算出來一個標識符使用了.總之能夠有三種方法讓程序指定關鍵字.一個是用IPC_PRIVATE,讓系統產生一個關鍵字,挑選一個隨機數.一個是本身指定,一個就是用ftok()函數. int size 是這塊內存的大小. int flag 是這塊內存的模式(mode)以及權限標識。 模式可取以下值:        新建:IPC_CREAT                                    使用已開闢的內存:IPC_ALLOC                                    若是標識符以存在,則返回錯誤值:IPC_EXCL 而後將「模式」 和「權限標識」進行「或」運算,作爲第三個參數。 如:    IPC_CREAT | IPC_EXCL | 0666   (例子中的0666爲權限標識) 這個函數成功時返回共享內存的ID,失敗時返回-1。   3) shmat()將這個內存區映射到本進程的虛擬地址空間。 函數說明: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> void    *shmat( int shmid , char *shmaddr , int shmflag ); shmat()是用來容許本進程訪問一塊共享內存的函數。 int shmid是那塊共享內存的ID。 char *shmaddr是共享內存的起始地址 int shmflag是本進程對該內存的操做模式。若是是SHM_RDONLY的話,就是隻讀模式。其它的是讀寫模式 成功時,這個函數返回共享內存的起始地址。失敗時返回-1。 4) shmdt()函數刪除本進程對這塊內存的使用 函數說明: shmdt()與shmat()相反,是用來禁止本進程訪問一塊共享內存的函數。 函數原型: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmdt( char *shmaddr ); 參數char *shmaddr是那塊共享內存的起始地址。 成功時返回0。失敗時返回-1。 5) shmctl() 控制對這塊共享內存的使用 shmctl()函數說明: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int     shmctl( int shmid , int cmd , struct shmid_ds *buf ); int shmid是共享內存的ID。 int cmd是控制命令,可取值以下:         IPC_STAT        獲得共享內存的狀態         IPC_SET         改變共享內存的狀態         IPC_RMID        刪除共享內存 struct shmid_ds *buf是一個結構體指針。IPC_STAT的時候,取得的狀態放在這個結構體中。若是要改變共享內存的狀態,用這個結構體指定。 返回值:        成功:0                 失敗:-1 示例程序: struct shmid_ds buf; ... ... shmctl( shmid , IPC_STAT , &buf );      //      取得共享內存的狀態 ... ...  shmctl( shmid , IPC_RMID , &buf );      //      刪除共享內存 注意!!!:在使用共享內存,結束程序退出後。若是你沒在程序中用shmctl()刪除共享內存的話,必定要在命令行下用ipcrm命令刪除這塊共享內存。你要是無論的話,它就一直在那兒放着了。 簡單解釋一下ipcs命令和ipcrm命令。 取得ipc信息: ipcs [-m|-q|-s] -m      輸出有關共享內存(shared memory)的信息 -q      輸出有關信息隊列(message queue)的信息 -s      輸出有關「遮斷器」(semaphore)的信息 %ipcs -m 刪除ipc ipcrm -m|-q|-s shm_id %ipcrm -m 105 下面再介紹一下struct shmid_ds 的相關構成: struct shmid_ds -----------------------------------------------     shmid_ds數據結構表示每一個新建的共享內存。當shmget()建立了一塊新的共享內存後,返回一個能夠用於引用該共享內存的shmid_ds數據結構的標識符。 include/linux/shm.h     struct shmid_ds {          struct ipc_perm    shm_perm;      /* operation perms */          int                shm_segsz;     /* size of segment (bytes) */          __kernel_time_t    shm_atime;     /* last attach time */          __kernel_time_t    shm_dtime;     /* last detach time */          __kernel_time_t    shm_ctime;     /* last change time */          __kernel_ipc_pid_t shm_cpid;      /* pid of creator */          __kernel_ipc_pid_t shm_lpid;      /* pid of last operator */          unsigned short     shm_nattch;    /* no. of current attaches */          unsigned short     shm_unused;    /* compatibility */          void               *shm_unused2; /* ditto - used by DIPC */          void               *shm_unused3; /* unused */      }; struct ipc_perm -----------------------------------------------     對於每一個IPC對象,系統共用一個struct ipc_perm的數據結構來存放權限信息,以肯定一個ipc操做是否能夠訪問該IPC對象。     struct ipc_perm {          __kernel_key_t   key;          __kernel_uid_t   uid;          __kernel_gid_t   gid;          __kernel_uid_t   cuid;          __kernel_gid_t   cgid;          __kernel_mode_t mode;          unsigned short   seq;  };   --------------------------------------------------------- 修改文件及文件夾權限: sudo chmod -(表明類型)×××(全部者)×××(組用戶)×××(其餘用戶) 經常使用修改權限的命令: sudo chmod 600 ××× (只有全部者有讀和寫的權限) sudo chmod 644 ××× (全部者有讀和寫的權限,組用戶只有讀的權限) sudo chmod 700 ××× (只有全部者有讀和寫以及執行的權限) sudo chmod 666 ××× (每一個人都有讀和寫的權限) sudo chmod 777 ××× (每一個人都有讀和寫以及執行的權限)
相關文章
相關標籤/搜索