linux程序通訊(一) 共享記憶體 訊號量

2021-08-24 19:13:52 字數 2296 閱讀 2418

/*server.c:向共享記憶體中寫入people*/

#include #include #include #include int main();

int semid;

int shmid;

key_t semkey;

key_t shmkey;

semkey=ftok("server.c",0);

shmkey=ftok("client.c",0);

/*建立共享記憶體和訊號量的ipc*/

semid=semget(semkey,1,0666|ipc_creat);

if(semid==-1)

printf("creat sem is fail\n");

shmid=shmget(shmkey,1024,0666|ipc_creat);

if(shmid==-1)

printf("creat shm is fail\n");

/*設定訊號量的初始值,就是資源個數*/

union semunsem_u;

sem_u.val=1;

semctl(semid,0,setval,sem_u);

/*將共享記憶體對映到當前程序的位址中,之後直接對程序中的位址addr操作就是對共享記憶體操作*/

struct people * addr;

addr=(struct people*)shmat(shmid,0,0);

if(addr==(struct people*)-1)

printf("shm shmat is fail\n");

/*訊號量的p操作*/

void p()

/*訊號量的v操作*/

void v()

/*向共享記憶體寫入資料*/

p();

strcpy((*addr).name,"xiaoming");

/*注意:①此處只能給指標指向的位址直接賦值,不能在定義乙個 struct people people_1;addr=&people_1;因為addr在addr=(struct people*)shmat(shmid,0,0);時,已經由系統自動分配了乙個位址,這個位址與共享記憶體相關聯,所以不能改變這個指標的指向,否則他將不指向共享記憶體,無法完成通訊了。

注意:②給字元陣列賦值的方法。剛才太虎了。。*/

(*addr).age=10;

v();

/*將共享記憶體與當前程序斷開*/

if(shmdt(addr)==-1)

printf("shmdt is fail\n");

}

/*client.c:從共享記憶體中讀出people*/

#include #include #include #include int main()

; /*讀取共享記憶體和訊號量的ipc*/

semid=semget(semkey,0,0666);

if(semid==-1)

printf("creat sem is fail\n");

shmid=shmget(shmkey,0,0666);

if(shmid==-1)

printf("creat shm is fail\n");

/*將共享記憶體對映到當前程序的位址中,之後直接對程序中的位址addr操作就是對共享記憶體操作*/

struct people * addr;

addr=(struct people*)shmat(shmid,0,0);

if(addr==(struct people*)-1)

printf("shm shmat is fail\n");

/*訊號量的p操作*/

void p()

/*訊號量的v操作*/

void v()

/*從共享記憶體讀出資料*/

p();

printf("name:%s\n",addr->name);

printf("age:%d\n",addr->age);

v();

/*將共享記憶體與當前程序斷開*/

if(shmdt(addr)==-1)

printf("shmdt is fail\n");

/*ipc必須顯示刪除。否則會一直留存在系統中*/

if(semctl(semid,0,ipc_rmid,0)==-1)

printf("semctl delete error\n");

if(shmctl(shmid,ipc_rmid,null)==-1)

printf("shmctl delete error\n");

}

linux程序通訊 共享記憶體

共享記憶體是ipc機制中的第二個。他允許連個不相關的程序訪問同一塊邏輯記憶體,能夠有效地實現兩個程序間資料傳遞。int shmget key t key,sizr t size,int shm 建立共享記憶體 key為共享記憶體段的命名,size為以位元組為單位的記憶體容量,shm 包含9位元許可權...

Linux程序通訊 共享記憶體

對於linux來講,不同程序之間的記憶體是不能讀寫的,乙個程序只能讀寫自己所屬的記憶體。a程序是不能讀寫b程序記憶體的?如果程式確實想通過記憶體交換資料怎麼辦?linux提供共享記憶體機制。共享記憶體是由核心處於多個程序間交換資訊的目的而留出的一塊記憶體區 段 共享記憶體也需要設定相關許可權的。這段...

Linux程序通訊 共享記憶體

共享記憶體 共享記憶體是一種最為高效的程序間通訊方式,在程序間通訊時核心專門的留出一塊記憶體區。在這段記憶體區可以由訪問程序將其對映到自己的私有位址空間。因此程序就可以直接讀寫這一塊記憶體區,極大的提高了效率。共享記憶體的步驟 1 建立共享記憶體 2 對映貢獻記憶體 原理 相關函式 shmget 建...