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 ××× (每個人都有讀和寫以及執行的權限)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章