当前位置:文档之家› Linux共享内存编程实例

Linux共享内存编程实例


printf( "shmat(
) failed/n" );
printf( "shared memory segment not found/n" ); return 0;
101. /*内存共享区段与旗语和消息队列不同,一个区段可以被锁定。 102. 103. 104. 105. 被锁定的区段不允许被交换出内存。这样做的优势在于,与其 把内存区段交换到文件系统,在某个应用程序调用时再交换回内存, 不如让它一直处于内存中,且对多个应用程序可见。从提升性能的角度 来看,很重要的。
166. 167. 168. 169. 170. } else if( !strncmp(argv[ 1 ],"use",3) ) { /*use the segment*/
171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. }
15. /* 16. 17. 18. 19. 20. 21. 22. 23. shmat( shmdt( */ ) ) shmctl( ) shmget( ) 创建一个新的共享内存区段 取得一个共享内存区段的描述符 取得一个共享内存区段的信息 为一个共享内存区段设置特定的信息 移除一个共享内存区段 挂接一个共享内存区段 于一个共享内存区段的分离
//must specify
also a letter to write to the buffer
if( argc<3 ) exit( -1 ); user=( char )argv[ 2 ][ 0 ]; //grab the segment shmid=shmget( MY_SHM_ID,0,0 ); block=( MY_BLOCK_T* )shmat( shmid,( const void* )0,0 );
138. }MY_BLOCK_T; 139. int main(int argc,char** argv) 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. { int shmid,ret,i; MY_BLOCK_T* block; struct sembuf sb; char user; //make sure there is a command if( argc>=2 ) { //create the shared memory segment and init it //with the semaphore if( !strncmp(argv[ 1 ],"create",6) ) { //create the shared memory segment and semaphore printf( "Creating the shared memory/n" ); shmid=shmget( MY_SHM_ID,sizeof( MY_BLOCK_T ),( IPC_CREAT|0666 ) );
85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. } else } else }
printf( "%s/n",(char*)mem ); //脱离共享内存区段 ret=shmdt( mem ); if( ret==0 ) printf( "Successfully detached memory /n" ); else printf( "Memory detached failed %d/n",errno );
24. //创建一个共享内存区段,并显示其相关信息,然后删除该内存共享区 25. #include <stdio.h> 26. #include <unistd.h> 27. #include <sys/ipc.h> 28. #include <sys/shm.h> 29. #define MY_SHM_ID 67483 30. int main( 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. { //获得系统中页面的大小 printf( "page size=%d/n",getpagesize( //创建一个共享内存区段 int shmid,ret; shmid=shmget( MY_SHM_ID,4096,0666|IPC_CREAT ); //创建了一个 4KB 大小共享内存区段。指定的大小必须是当前系统架构 //中页面大小的整数倍 if( shmid>0 ) printf( "Create a shared memory segment %d/n",shmid ); //获得一个内存区段的信息 ) ); ) //getpagesize( )
129. #include <unistd.h> 130. #define MY_SHM_ID 34325 131. #define MY_SEM_ID 23234 132. #define MAX_STRING 200 133. typedef struct 134. { 135. 136. 137. int semID; int counter; char string[ MAX_STRING+1 ];
/*##########重点就是使用旗语对共享区的访问###########*/ for( i=0;i<100;++i ) { sleep( 1 ); //设置成 1s 就会看到 a/b 交替出现,为 0 则 a 和 b 连续出现 //grab the semaphore sb.sem_num=0; sb.sem_op=-1; sb.sem_flg=0; if( semop( block->semID,&sb,1 )!=-1 ) { //write the letter to the segment buffer //this is our CRITICAL SECTION block->string[ block->counter++ ]=user;
63. //共享内存区段的挂载,脱离和使用 64. //理解共享内存区段就是一块大内存 65. #include <stdio.h> 66. #include <sys/shm.h> 67. #include <sys/ipc.h> 68. #include <errno.h> 69. #define MY_SHM_ID 67483 70. int main( 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. em ); 83. 84. //向共享区段内存写入数据 strcpy( ( char* )mem,"This is a test string./n" ); { //共享内存区段的挂载和脱离 int shmid,ret; void* mem; shmid=shmget( MY_SHM_ID,0,0 ); if( shmid>=0 ) { mem=shmat( shmid,( const void* )0,0 ); //shmat()返回进程地址空间中指向区段的指针 if( ( int )mem!=-1 ) { printf( "Shared memory was attached in our address space at %p/n",m )
Linux 共享内存编程实例
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. /*共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间) 从而使得这些进程可以相互通信。 在 GNU/Linux 中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接口 API 允许一个进程使 用公共内存区段。但是对内存的共享访问其复杂度也相应增加。共享内存的优点是简易性。 使用消息队列时,一个进程要向队列中写入消息,这要引起从用户地址空间向内核地址空间的一次复制, 同样一个进程进行消息读取时也要进行一次复制。共享内存的优点是完全省去了这些操作。 共享内存会映射到进程的虚拟地址空间,进程对其可以直接访问,避免了数据的复制过程。 因此,共享内存是 GNU/Linux 现在可用的最快速的 IPC 机制。 进程退出时会自动和已经挂接的共享内存区段分离,但是仍建议当进程不再使用共享区段时 调用 shmdt 来卸载区段。 注意,当一个进程分支出父进程和子进程时,父进程先前创建的所有共享内存区段都会被子进程继承。 如果区段已经做了删除标记(在前面以 IPC——RMID 指令调用 shmctl),而当前挂接数已经变为 0, 这个区段就会被移除。 */
106. */ 107. int shmid; 108. //... 109. shmid=shmget( MY_SHM_ID,0,0 ); 110. ret=shmctl( shmid,SHM_LOCK,0 ); 111. if( ret==0 ) 112. printf( "Locked!/n" );
113. //////////////////////////////////////////////////////////////////////// 114. /*使用旗语协调共享内存的例子 115. 116. 117. 118. 119. 120. 121. 使用和编译命令 gcc -Wall test.c -o test ./test create ./test use a & ./test use b & ./test read & ./test re58. 159. 160. 161. 162. 163. 164. 165.
相关主题