文档详情

《Linux应用实例教程》课件_讲义31并发程序-共享内存通信.pptx

发布:2025-03-05约3.08千字共13页下载文档
文本预览下载声明

S10、并发程序-共享内存通信S10、并发程序-共享内存通信

S10、并发程序-共享内存通信1、共享内存通信写程序shmmutexwrite.c:#includesemaphore.h#includestdio.h#includestdlib.h#includesys/types.h#includesys/ipc.h#includesys/sem.h#includesys/shm.h#includesys/stat.h

S10、并发程序-共享内存通信#includefcntl.h#includestring.h#defineBUFFER_SIZE10#definesem_namemysemintmain(){structStu{charname[10];intscore;};intshmid; sem_t*sem; intscore=60,i=1; charbuff[BUFFER_SIZE];

S10、并发程序-共享内存通信 key_tshmkey; shmkey=ftok(shmmutexread.c,0); sem=sem_open(sem_name,O_CREAT,0644,1); if(sem==SEM_FAILED) { printf(unabletocreatsemaphore!); sem_unlink(sem_name); //删除有名信号量 exit(-1); } shmid=shmget(shmkey,1024,0666|IPC_CREAT); /*创建IPC键值为shmkey的共享内存,其大小为1024字节,允许读写*/ if(shmid==-1) printf(creatshmisfail\n);

S10、并发程序-共享内存通信 structStu*addr; addr=(structStu*)shmat(shmid,0,0); if(addr==(structStu*)-1) printf(shmshmatisfail\n); addr-score=0;printf(写进程映射的共享内存地址=%p\n,addr); do { sem_wait(sem); memset(buff,0,BUFFER_SIZE); memset((addr+i)-name,0,BUFFER_SIZE); printf(写进程:输入一些姓名(不超过10个字符)到共享内存(输入quit退出):\n);

S10、并发程序-共享内存通信 if(fgets(buff,BUFFER_SIZE,stdin)==NULL) { sem_post(sem); break; } strncpy((addr+i)-name,buff,strlen(buff)-1); (addr+i)-score=++score; addr-score++; i++; sem_post(sem); sleep(1); }while(strncmp(buff,quit,4)!=0);

S10、并发程序-共享内存通信 if(shmdt(addr)==-1) /*将共享内存与当前进程断开*/ printf(shmdtisfail\n); sem_close(sem); //关闭有名信号量 sem_unlink(sem_name); //删除有名信号量}

S10、并发程序-共享内存通信读程序shmmutexread.c:#includesemaphore.h?#includestdio.h?#includestdlib.h?#includesys/types.h?#includesys/ipc.h?#includesys/sem.h?#includesys/shm.h?#includesys/stat.h?#includefcntl.h?#includestring.h?#definesem_namemysem

S10、并发程序-共享内存通信intmain()?{? intshmid; sem_t*sem; inti=1; key_tshmkey; shmkey=ftok(shmmutexread.c,0); structStu? {? charname[10];? intscore;? };

S10、并发程序-共享内存通信

显示全部
相似文档