int shmget(key_t key, size_t size, int shmflg); // key的值 0/IPC_PRIVATE IPC_CREATE時建立一塊內存 // size 多少字節 // 標誌
返回共享內存的標識符
void *shmat(int shmid, const void *shmaddr, int shmflg); // 建立時返回de 共享內存的標識符 // flag 決定以什麼方式映射 通常是0 // addr
int shmdt(const void *shmaddr);
linux 中wait用法linux
進程一旦調用了wait就當即阻塞本身,由wait自動分析是否當前進程的某個子進程已經退出,若是讓它找到了這樣一個已經變成殭屍的子進程,wait就會收集這個子進程的信息,並把它完全銷燬 後返回;若是沒有找到這樣一個子進程,wait就會一直阻塞在這裏,直到有一個出現爲止。函數
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define PERM S_IRUSR|S_IWUSR /* 共享內存 */ int main(int argc,char **argv) { int shmid; char *p_addr,*c_addr; if(argc!=2) { fprintf(stderr,"Usage:%s\n\a",argv[0]); exit(1); } /* 建立共享內存 */ if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1) { fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno)); exit(1); } /* 建立子進程 */ if(fork()) // 父進程寫 { p_addr=shmat(shmid,0,0); // 傳 0 表明由系統自動給你指定一個地址 memset(p_addr,'\0',1024); strncpy(p_addr,argv[1],1024); wait(NULL); // 釋放資源,不關心終止狀態 exit(0); } else // 子進程讀 { sleep(1); // 暫停1秒 c_addr=shmat(shmid,0,0); printf("Client get %p\n",c_addr); exit(0); } }