共享內存原型
shmid_ds結構
struct shmid_ds{
??? struct ipc_perm??? shm_perm;
??? size_t?????????????????? shm_segsz;
??? pid_t??????????????????? shm_lpid;
??? pid_t????????????????????shm_cpid;
??? shmatt_t???????????????shm_nattch;
??? time_t???????????????????shm_atime;
??? time_t?????????????????? shm_dtime;
????time_t?????????????????? shm_ctime;
??? .
};
#include <sys/shm.h>
int shmget (key_t? key, size_t size, int flag);
???? 成功返回共享存儲ID,錯誤返回-1
int shmctl (int shmid, int cmd, struct shmid_ds,*buf);
???? cmd有 IPC_STAT, IPC_SET, IPC_RMID, SHM_LOCK, SHM_UNLOCK
連接到地址空間
void *shmat (int shmid ,const void *addr, int flag);
對共享內存操作結束時,脫離該段
int shmdt (void *addr);
要運行程序,需要在當前目錄下建立一個share文件,share是一個空文件,沒有任何意義,只是函數ftok需要一個文件名作參數,ftok另一個參數可以為任何數字。
程序運行后,分為父子進程,子進程申請共享內存,然后等待父進程繼續執行,父進程首先等待子進程申請到共享內存標識,然后輸出共享內存中的內容,為了演示共享內存可以隨時更新,程序中在子進程里產生隨機數寫入共享內存供父進程讀取。
代碼如下:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<signal.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
int shmID;
char * buf;
?
void finalize(int signo)
{
?shmctl(shmID,IPC_RMID,NULL);
?
?exit(0);
}
int main()
{
?int i = 1;??
?key_t shmKey;
?
?signal(SIGINT,finalize);
?signal(SIGTERM,finalize);
?
?if(fork() == 0)?//子進程
?{??
??shmKey = ftok("share",16);??//可以使用任何大于0的數字,如果名字和數相同,則產生的key相同。
??if(shmKey == -1)
??{
???printf("創建key出錯\n");
???exit(-1);
??}
??
??shmID = shmget(shmKey,20,IPC_CREAT | IPC_EXCL | 0666);
??if(shmID == -1)
??{
???printf("創建共享標識出錯\n");
???exit(-1);
??}
??
??sleep(2);?//等待父進程執行,好顯示第一行為空。
??while(1)
??{
???buf = (char *)shmat(shmID,NULL,0);
???srandom(time(NULL));
???sprintf(buf,"%d",random());?
???shmdt(buf);??
??}
?}
?else??//父進程
?{
??sleep(1);?//讓子進程先執行,以建立內存映射。
??
??shmKey = ftok("share",16);??//可以使用任何大于0的數字,如果名字和數相同,則產生的key相同。
??if(shmKey == -1)
??{
???printf("創建key出錯\n");
???exit(-1);
??}
??
??shmID = shmget(shmKey,20,0);?//0表示如果shmKey映射的不存在則報錯。
??if(shmID == -1)
??{
???printf("引用共享標識出錯\n");
???exit(-1);
??}
??
??while(1)
??{?
???buf = (char *)shmat(shmID,NULL,0);
???printf("%d. 現在共享內存中的內容為:%s\n",i++,buf);
???shmdt(buf);
???sleep(1);
??}
?}?
?return 0;
}
?