{"id":533,"date":"2013-11-24T23:51:00","date_gmt":"2013-11-24T15:51:00","guid":{"rendered":"http:\/\/note.systw.net\/note\/?p=533"},"modified":"2023-11-03T23:55:51","modified_gmt":"2023-11-03T15:55:51","slug":"c%e8%aa%9e%e8%a8%80-linux-shared-memory","status":"publish","type":"post","link":"https:\/\/systw.net\/note\/archives\/533","title":{"rendered":"C\u8a9e\u8a00-Linux shared memory"},"content":{"rendered":"\n<p><strong>shared memory on linux<\/strong><br>\u5be6\u4f5cfunction\u6709shmget\u548cmmap<\/p>\n\n\n\n<p>\u800cshmget\u4e3b\u8981\u7684function\u6709<br>shmget()<br>shmat()<br>shmdt()<br>shmctl()<\/p>\n\n\n\n<p>refer<br>http:\/\/baike.baidu.com\/view\/3838033.htm<br>http:\/\/blog.csdn.net\/wlh_flame\/article\/details\/6328380<\/p>\n\n\n\n<p>&#8230;<\/p>\n\n\n\n<p><strong>shmget()<\/strong><br>\u7528\u4f86\u5f97\u5230\u4e00\u500bshared memory id\u6216\u5efa\u7acb\u4e00\u500bshared memory object\u3002<br>\u683c\u5f0f\u5982\u4e0b<br>\u3000<strong>shmget(key_t key, size_t size, int shmflg)<\/strong><br>\u53c3\u6578\u8aaa\u660e\u5982\u4e0b<br>Key\uff1a0\u8868\u793a\u5efa\u7acb\u65b0\u7684shared memory object\uff0c&gt;0\u8868\u793a\u6839\u64dashmflag\u7684\u503c\u64cd\u4f5c\u3002<br>Size\uff1a0\u8868\u793a\u53ea\u53d6\u5f97share memory\uff0c&gt;0\u5247\u8868\u793a\u8981\u6307\u5b9a\u7684shared memory\u5927\u5c0f\u3002<br>shmflag\uff1a\u4f7f\u7528IPC_CREAT\u6642\uff0c\u82e5\u6c92\u6709shared memory object\u5247\u5efa\u7acb\u4e00\u500b\uff0c\u82e5\u6709\u5247\u56de\u50b3shared memory id\u3002<br>ex:<br>shm_id=shmget(key,0, 0);<br>shm_id=shmget(key,4096,IPC_CREAT|IPC_EXCL|0600)<br>shm_id=shmget(SHMKEY, MAXBUF+1, 0666)<br>shm_id=shmget(SHMKEY, MAXBUF+1, IPC_CREAT | 0666)<br>refer<br>http:\/\/man7.org\/linux\/man-pages\/man2\/shmget.2.html<\/p>\n\n\n\n<p><br><strong>shmat()<\/strong><br>\u900f\u904eshmget()\u7522\u751f\u7684shared memory id\u5c07shared memory object\u6620\u5c04\u5230memory\uff0c\u4e4b\u5f8c\u6703\u56de\u50b3\u53ef\u76f4\u63a5\u5b58\u53d6\u7684shared memory address\u3002<br>\u683c\u5f0f\u5982\u4e0b<br>\u3000<strong>shmat(int shmid, const void *shmaddr, int shmflg)<\/strong><br>\u53c3\u6578\u8aaa\u660e\u5982\u4e0b<br>\u3000shmid\uff1a\u4f7f\u7528\u90a3\u4e00\u500bshared memory id\u3002<br>\u3000shmaddr\uff1a\u6307\u5b9ashared memory\u8981\u51fa\u73fe\u7684\u4f4d\u7f6e\uff0c\u76f4\u63a5\u6307\u5b9anull\u53ef\u8b93\u4f5c\u696d\u7cfb\u7d71\u81ea\u5df1\u6c7a\u5b9a\u3002<br>\u3000shmflag\uff1a\u76f4\u63a5\u4f7f\u75280\u5373\u53ef\u3002<br>ex:<br>shm = shmat(shm_id, NULL, 0)<br>shm =(people*)shmat(shm_id,NULL,0)<br>refer<br>http:\/\/man7.org\/linux\/man-pages\/man2\/shmat.2.html<\/p>\n\n\n\n<p><br><strong>shmdt()<\/strong><br>\u5c07shared memory\u7684address\u95dc\u9589\uff0c\u6210\u529f\u6703\u50b3\u56de0<br>\u683c\u5f0f\u5982\u4e0b<br>\u3000<strong>shmdt(const void *shmaddr)<\/strong><br>\u53c3\u6578\u8aaa\u660e\u5982\u4e0b<br>\u3000shmaddr\uff1ashared memory\u7684address<br>ex:<br>shmdt(shm);<br>refer<br>http:\/\/man7.org\/linux\/man-pages\/man2\/shmdt.2.html<\/p>\n\n\n\n<p><br><strong>shmctl()<\/strong><br>\u7ba1\u7406shared memory<br>\u683c\u5f0f\u5982\u4e0b<br><strong>\u3000shmctl(int shmid, int cmd, struct shmid_ds *buf)<\/strong><br>\u53c3\u6578\u8aaa\u660e\u5982\u4e0b<br>cmd\uff1a\u6709\u4ee5\u4e0b\u4e09\u7a2e\u53c3\u6578\u53ef\u9078<br>\u3000IPC_STAT\uff1a\u5f97\u5230shared memory\u7684\u72c0\u614b<br>\u3000IPC_SET\uff1a\u6539\u8b8ashared memory\u7684\u72c0\u614b<br>\u3000IPC_RMID\uff1a\u522a\u9664shared memory<br>buf\uff1ashared memory\u7d50\u69cb<br>ex:<br>shmctl(shmid, IPC_RMID, NULL);<br>refer<br>http:\/\/man7.org\/linux\/man-pages\/man2\/shmctl.2.html<br><br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<br><\/p>\n\n\n\n<p><strong>shared memory\u5728linux\u5e38\u7528\u7684\u6307\u4ee4\u3000<\/strong><\/p>\n\n\n\n<p>\u986f\u793a\u76ee\u524d\u7684Shared Memory Segments<br><strong>#ipcs -m<\/strong><br>&#8212;&#8212; Shared Memory Segments &#8212;&#8212;&#8211;<br>key shmid owner perms bytes nattch status<br>0x50494f4e 0 nobody 666 2016 1<br>0x000004d2 2064385 root 666 1025 0<\/p>\n\n\n\n<p>\u522a\u9664\u6307\u5b9a\u7684Shared Memory Segments<br><strong>#ipcrm -m &lt; shmid&gt;<\/strong><br>ex:<br>\u5220\u9664key=0x000004d2 shmid=2064385\u7684\u5171\u4eab\u5185\u5b58<br>#ipcrm -m 2064385<\/p>\n\n\n\n<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<\/p>\n\n\n\n<p><strong>\u4ee5shared memory\u5be6\u4f5c\u7c21\u6613\u804a\u5929\u7a0b\u5f0f\u7bc4\u4f8b<\/strong><\/p>\n\n\n\n<p>\u57f7\u884c\u65b9\u5f0f\u70ba<br>#chat &lt; username&gt;<\/p>\n\n\n\n<p>#vi chat.c<br>\u7a0b\u5f0f\u78bc\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt; sys\/types.h>\n#include &lt; sys\/ipc.h>\n#include &lt; sys\/shm.h>\n#include &lt; stdio.h>\n#include &lt; stdlib.h>\n#include &lt; string.h>\n#include &lt; unistd.h>\n\n#define PERMS 0666\n#define SHMKEY ((key_t) 1234) \u00a0\n#define MAXBUF 2048\n\nint inputchat(char *username){\n\u3000int shmid, str_len;\n\u3000key_t key;\n\u3000char *shm;\n\u3000char str_buf&#91;MAXBUF]=\"\";\n\u3000char str2_buf&#91;MAXBUF]=\"\";\n\u3000char speaker&#91;100];\n\u3000if ((shmid = shmget(SHMKEY, MAXBUF+1, PERMS)) &lt; 0) {\n\u3000\u3000perror(\"shmget\");\n\u3000\u3000exit(1);\n\u3000}\n\u3000if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {\n\u3000\u3000perror(\"shmat\");\n\u3000\u3000exit(1);\n\u3000}\n\u3000strcpy(speaker,username);\n\u3000strcat(speaker,\":\");\n\u3000printf(\"Hello %s, Enter Words: n\",username);\n\u3000while (1) {\n\u3000\u3000strcpy(str_buf, \"\");\n\u3000\u3000fgets(str_buf,2000, stdin);\n\u3000\u3000strncpy(str2_buf,speaker,30);\n\u3000\u3000strcat(str2_buf,str_buf);\n\u3000\u3000str_len = strlen(str2_buf);\n\u3000\u3000strcpy(shm,str2_buf);\n\u3000}\n}\n\nint outputchat(){\n\u3000int shmid;\n\u3000key_t key;\n\u3000char *shm, *s;\n\u3000if ((shmid = shmget(SHMKEY, MAXBUF+1, IPC_CREAT | PERMS)) &lt; 0) {\n\u3000\u3000perror(\"shmget\");\n\u3000\u3000exit(1);\n\u3000}\n\u3000if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {\n\u3000\u3000perror(\"shmat\");\n\u3000\u3000exit(1);\n\u3000}\n\u3000while(1){\n\u3000\u3000shm&#91;MAXBUF] = 1;\n\u3000\u3000while(strstr(shm, \"n\") == NULL){\n\u3000\u3000\u3000if(shm&#91;MAXBUF] == 1){\n\u3000\u3000\u3000\u3000continue;\n\u3000\u3000\u3000}\n\u3000\u3000}\n\u3000\u3000printf(\"%s \", shm);\n\u3000\u3000sleep(1);\n\u3000\u3000strcpy(shm,\"\");\n\u3000}\n}\n\nint main(int argc, char **argv){\n\u3000pid_t fpid;\n\u3000fpid=fork();\n\u3000if(fpid &lt; 0)\n\u3000\u3000printf(\"error in fork!\");\n\u3000else if (fpid == 0) {\n\u3000\u3000outputchat();\n\u3000}else {\n\u3000\u3000inputchat(argv&#91;1]);\n\u3000}\n\u3000return 0;\n}<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>shared memory on linux\u5be6\u4f5cfuncti &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[14],"tags":[],"class_list":["post-533","post","type-post","status-publish","format-standard","hentry","category-develop"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/comments?post=533"}],"version-history":[{"count":0,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/533\/revisions"}],"wp:attachment":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/media?parent=533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/categories?post=533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/tags?post=533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}