共用記憶體的函數有以下幾個:
(1)int shmget(key_t key, int size, int shmflg),開闢或使用一塊共用記憶體。
(2)void *shmat(int shmid, const void *shmaddr, int shmflg), 將參數shmid所指向的共用記憶體與當前進程串連。
當使用某共用記憶體時,需要先使用shmat,達成串連。
(3)int shmdt(const void *shmaddr),將先前用shmat串連的共用記憶體與當前進程解除串連。參數shmaddr為shmat返回的共用記憶體的地址。
在完成對共用記憶體的使用後,需要使用shmdt解除串連。
(4)int shmctl(int shmid, int cmd, struct shmid_ds *buf),控制記憶體的操作。當cmd為IPC_RMID時,刪除shmid所指的共用記憶體。
這些函數的表標頭檔為<sys/ipc.h>和<sys/shm.h>,其詳細參數請去網上搜尋。
下面給出一個使用共用記憶體實現處理序間通訊的例子:進程A開闢一塊新的共用記憶體,進程B修改這個共用記憶體,進程C列印輸出這個共用記憶體的內容,進程D刪除這個共用記憶體。
進程BCD啟動並執行命令格式為:命令 共用記憶體ID,如./output 123432。
進程A代碼如下:
int main(){int shmid;shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT | 0600);if (shmid < 0){perror("shmget error");exit(1);}printf("create shared memory OK. shmid=%d/n", shmid);return 0;}
進程B代碼如下:
int main(int argc, char *argv[]){int shmid;char *shmaddr;if (argc != 2){perror("argc error/n");exit(1);}shmid = atoi(argv[1]);shmaddr = (char *)shmat(shmid, NULL, 0);if ((int )shmaddr == -1){perror("shmat error./n");exit(1);}strcpy(shmaddr, "hello, world!");shmdt(shmaddr);return 0;}
進程C代碼如下:
int main(int argc, char *argv[]){int shmid;char *shmaddr;if (argc != 2){printf("argc error/n");exit(1);}shmid = atoi(argv[1]);shmaddr = (char *)shmat(shmid, NULL, 0);if ((int )shmaddr == -1){perror("shmat error./n");exit(1);}printf("%s/n", shmaddr);shmdt(shmaddr);return 0;}
進程D代碼如下:
int main(int argc, char *argv[]){int shmid;if (argc != 2){perror("argc error/n");exit(1);}shmid = atoi(argv[1]);shmctl(shmid, IPC_RMID, NULL);return 0;}