基础知识共享内存是一种进程间通信方式由内核开辟一块物理内存映射到多个进程的虚拟地址空间进程可以直接读写该内存区域无需内核复制数据通信速度最快但它自身不具备同步能力需要配合信号量实现互斥访问。进程结束共享内存不会消失仍然可以被其他进程使用重启系统共享内存才会消失命令ipcs查看进程间通信参数-s信号量 -m共享内存 -q消息队列命令ipcrm-s删除信号量-m删除共享内存代码两个进程间通过共享内存传递数据:文件main.c向共享内存写入数据#include stdio.h #include stdlib.h #include unistd.h #include string.h #include sys/shm.h int main() { int shmid shmget((key_t)1234,128,IPC_CREAT|0600);//共享内存id if( -1 shmid ) { exit(1); } char* s (char*)shmat(shmid,NULL,0);//建立映射关系让指针s指向共享内存空间 if( s (char*)-1) { exit(1); } while( 1 ) { printf(input\n); char buff[128] {0}; fgets(buff,128,stdin); strcpy(s,buff); if( strncmp(buff,end,3) 0) { break; } } shmdt(s);//断开映射关系当前进程不能再使用该共享内存 }文件test.c读取共享内存中的数据#include stdio.h #include stdlib.h #include unistd.h #include string.h #include sys/shm.h int main() { int shmid shmget((key_t)1234,128,IPC_CREAT|0600);//通过key值确定是上面的同一块共享内存 if( shmid -1) { exit(1); } char* s (char*)shmat(shmid,NULL,0); if( s (char*)-1) { exit(1); } while( 1 ) { if(strncmp(s,end,3) 0 ) { break; } printf(read:%s\n,s); sleep(1); } shmdt(s); shmctl(shmid,IPC_RMID,NULL);//删除共享内存IPC_RMID类似于信号 exit(0); }