#include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include <unistd.h> #include <string.h> #include <sys/sem.h> #define SHM_SIZE 1024 //共享內存的大小 int main(int argc,char *argv[]) { int ret, //臨時變量 pid, //進程id sme_id, //保存信號量描述符 shm_id; //保存共享內存描述符 key_t sme_key, //保存信號量鍵值 shm_key; //保存共享內存鍵值 char *shmp; //指向共享內存的首地址 struct shmid_ds dsbuf; //定義共享內存信息結構變量 struct sembuf lock = {0, -1, SEM_UNDO}; //信號量上鎖操作的數組指針 struct sembuf unlock = {0, 1, SEM_UNDO | IPC_NOWAIT};//信號量解鎖操作的數組指針 shm_key = ftok(*(argv+1), 2); //獲取信號量鍵值 if(shm_key < 0) { perror("ftok"); //調用ftok函數出錯 exit(0); } sme_id = semget(shm_key, 1, IPC_CREAT | 0666); //獲取信號量ID if(sme_id < 0) { perror("semget"); //調用semget函數出錯 exit(0); } shm_key = ftok(*(argv+2), 1); //獲取共享內存鍵值 if(shm_key < 0) { perror("ftok"); exit(0); } shm_id = shmget(shm_key, SHM_SIZE, IPC_CREAT | 0666); //獲取共享內存ID if(shm_id < 0) { perror("shmget"); exit(0); } shmp = shmat(shm_id, NULL, 0); //映像共享內存 if((int)shmp == -1) { perror("shmat"); exit(0); } pid = fork(); //創建子進程 if(pid < 0) { perror("fork"); exit(0); } else if(pid == 0) //子進程 { ret = semctl(sme_id, 0, SETVAL, 1); //初始化信號量,初值設為1 if(ret == -1) { perror("semctl"); exit(0); } ret = semop(sme_id, &lock, 1); //申請訪問共享資源,鎖定臨界資源 if(ret == -1) { perror("semop lock"); exit(0); } sleep(4); //讓子進程睡眠4秒 strcpy(shmp, "hello\n"); //往共享內存寫入數據 if(shmdt((void *)shmp) < 0) //使共享內存脫離進程地址空間 { perror("shmdt"); } ret = semop(sme_id, &unlock, 1); //解鎖臨界資源 if(ret == -1) { perror("semop unlock"); exit(0); } } else //父進程 { sleep(1); //先讓子進程運行 ret = semop(sme_id, &lock, 1); //申請訪問共享資源,鎖定臨界資源 if(ret == -1) { perror("semop lock"); exit(0); } if(shmctl(shm_id, IPC_STAT, &dsbuf) < 0) //獲取共享內存信息 { perror("shmctl"); exit(0); } else /* 共享內存的狀態信息獲取成功 */ { printf("Shared Memory Information:\n"); printf("\tCreator PID: %d\n", dsbuf.shm_cpid); /* 輸出創建共享內存進程的標識符 */ printf("\tSize(bytes): %d\n",dsbuf.shm_segsz); /* 輸出共享內存的大小 */ printf("\tLast Operator PID: %d\n",dsbuf.shm_lpid); /* 輸出上一次操作共享內存進程的標識符 */ printf("Received message : %s\n", (char *)shmp); /* 從共享內存中讀取數據 */ } if(shmdt((void *)shmp) < 0) //使共享內存脫離進程地址空間 { perror("shmdt"); exit(0); } ret = semop(sme_id, &unlock, 1); //解鎖臨界資源 if(ret == -1) { perror("semop unlock"); exit(0); } if(shmctl(shm_id, IPC_RMID, NULL) < 0) /* 刪除前面創建的共享內存 */ { perror("shmctl"); exit(0); } ret = semctl(sme_id, 0, IPC_RMID, NULL); //刪除信號量 if(ret == -1) { perror("semctl"); exit(0); } } return 0; }
網頁名稱:[Linux管道和IPC]使用信號量和共享內存進行父子進程通信
文章URL:http://m.kartarina.com/article2/pgodoc.html
成都網站建設公司_創新互聯,為您提供自適應網站、全網營銷推廣、動態網站、外貿建站、網站收錄、面包屑導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯