創建共享內存和操做共享內存幾個函數的用法

創建共享內存和操做共享內存幾個函數的用法
在建立共享內存和操做共享內存的時候被下面這些函數的參數弄糊塗了,
遂查找資料寫下各個函數的說明。

所需頭文件
#include<sys/ipc.h>
#include<sys/shm.h>
函數
(1)shmget(key_t key,int size,int shmflag)
函數說明
shmget()用來取得參數key所關聯的共享內存識別代號,若是key是IPC_PRIVATE則會創建新的共享內存,
其大小由size決定,若是key不爲IPC_PRIVATE,也不是已創建的IPC key,那麼系統回視參數
shmflag是否有IPC_CREAT位,來肯定以IPC key爲參數的key的
共享內存。若是參數shmflag包含了IPC_CRATE 和IPC_EXCL位,
而沒法依參數key來創建共享內存,則表示該共享內存已存在。
錯誤代碼:
EINVAL  參數size小於SHMMIN或大於SHMMAX
EEXIST   欲創建key所致新的共享內存,但已存在
EIDRM    參數key所致的共享內存已刪除
ENOENT   參數key所指的共享內存不存在,參數shmflag也沒設置         IPC_CREAT位
ENOMEM  核心內存不足
ENOSPC   已超過系統容許可創建的共享內存最大值


(2)int shmdt(const void *shmaddr)
函數說明:
shmdt()用來將先前用shmat()鏈接好的共享內存脫離目前的進程,
參數shmaddr爲先前shmat()返回的共享內存地址

(3)int shmctl(int shmid,int cmd,struct shmid_ds *buf)

shmctl()提供了幾種方式來控制共享內存操做,其中cmd有下列幾種數值:
IPC_STAT 把共享內存的shmid_ds結構數據複製到引數buf
IPC_SET  將參數buf所指的shmid_ds結構中的shm_perm.uid、shm_perm.gid 
               shm_perm.mode複製到共享內存的shmid_ds結構中
IPC_RMID 刪除共享內存和其數據結構
SHM_LOCK  不讓此共享內存置換到swap
SHM_UNLOCK  容許此共享內存置換到swap
SHM_LOCK 和SHM_UNLOCK爲linux特有,且惟有超級用戶容許使用

shmid_ds 的結構定義以下
struct shmid_ds
 {
   struct ipc_perm  shm_perm;
   int     shm_segsz;//共享內存大小,以字節計算
   time_t  shm_atime;//最後一次attach此共享內存的時間
   time_t  shm_dtime;//最後一次detach此共享內存的時間
   time_t  shm_ctime;//最後一次更改此共享內存的時間
   unsigned short shm_cpid;//創建此共享內存的進程識別碼
   unsigned short shm_lpid;//最後一次操做此共享內存的進程識別碼
    short shm_nattch;
    unsigned short shm_npages;
    unsigned long *shm_pages;
    struct shm_desc *attaches;
  };
注意(1)要理解各個函數參數有哪些
    (2)這些參數的做用是什麼
    (3)這些會幫助理解函數的使用方法(工做機理)
建立共享內存和操做共享內存實例
linux

  1. #include<unistd.h>
  2. #include<sys/ipc.h>
  3. #include<sys/shm.h>
  4. #include<stdio.h>
  5. #include<string.h>
  6.  #define KEY  1234
  7.  #define SIZE 1024

  8. int main()
  9. {
  10.  
  11.  int shmid;
  12.  char *shmaddr;
  13.  struct shmid_ds buf;
  14. //創建共享內存
  15.  shmid = shmget(KEY,SIZE,IPC_CREAT | 0600);
  16.   
  17.   if( fork() == 0 )
  18.     {
  19.      shmaddr =(char *)shmat(shmid,NULL,0);
  20.       strcpy(shmaddr,"hi! i am child process!\n");
  21.       shmdt(shmaddr);
  22.       return 0;
  23.     }
  24.   else
  25.     {
  26.      sleep(3);
  27.      shmctl(shmid,IPC_STAT,&buf);
  28.       printf("shm_segsz = %d bytes\n",buf.shm_segsz);
  29.   printf("shm_cpid = %d\n",buf.shm_cpid);
  30.   printf("shm_lpid = %d\n",buf.shm_lpid);
  31.   shmaddr =(char *)shmat(shmid,NULL,0);
  32.   printf("%s",shmaddr);
  33.   shmdt(shmaddr);
  34.    shmctl(shmid,IPC_RMID,NULL);
  35.     }
  36.  return 0;
  37. }
相關文章
相關標籤/搜索