{"id":3848,"date":"2020-07-17T05:29:23","date_gmt":"2020-07-16T20:29:23","guid":{"rendered":"https:\/\/now0930.pe.kr\/wordpress\/?p=3848"},"modified":"2020-07-17T05:40:38","modified_gmt":"2020-07-16T20:40:38","slug":"semaphore-p223-p238","status":"publish","type":"post","link":"https:\/\/now0930.pe.kr\/wordpress\/semaphore-p223-p238\/","title":{"rendered":"semaphore p223 ~ p238"},"content":{"rendered":"\n<p>name semaphore\ub294 \/dev\/shm\uc5d0 \uc800\uc7a5\ub41c\ub2e4. \uc774\ub984\uc744 \uc5c4\ud55c \/tmp\/xxx \uc774\ub7f0 \uc2dd\uc73c\ub85c \ub9cc\ub4e4\uba74 \uc138\ub9c8\ud3ec\uc5b4\ub97c \ub9cc\ub4e4 \uc218 \uc5c6\ub2e4. segment error\ub85c \uc8fd\ub294\ub2e4. \ucc45\uc5d0\uc11c\ub294 \/tmp\/\ub85c \ub123\uc5b4\ub3c4 \uc798 \ub3d9\uc791\ud574\uc11c \ud655\uc778\ud558\ub294\ub370 \uc624\ub798 \uac78\ub838\ub2e4.<\/p>\n\n\n\n<p>\ub514\ubc84\uadf8 \ud558\ub2e4 \uc911\uac04\uc5d0 \uba48\ucd94\uba74 \/dev\/shm\uc5d0 sem*\ub85c \ud30c\uc77c\uc744 \uc9c0\uc6b8 \uc218 \uc5c6\uc5b4 \ub2e4\uc74c \uc2e4\ud589\uc5d0 \uc138\ub9c8\ud3ec\uc5b4\ub97c \ubc1b\uc744 \uc218 \uc5c6\ub2e4. \ucc98\uc74c \uc2dc\uc791 \uc804 \uc790\uae30 \uc774\ub984\uc73c\ub85c \ub41c \uc138\ub9c8\ud3ec\uc5b4 \uc788\uc73c\uba74 \uc9c0\uc6cc\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p>thread\ub97c \ub3cc\ub9ac\uba74 \ubbf8\uce5c race condition\uc774 \ud53c\uace4\ud558\uac8c \ud55c\ub2e4. \ucc38 \ud5f7\uac08\ub9ac\ub294\ub370, \uc790\uc8fc\ubcf4\uba74 \uc775\uc219\ud574 \uc9c0\uaca0\uc9c0. thread\ub97c \ub3cc\ub9ac\uba74 \uc21c\uc11c\ub294 \uc774\uc81c \ubcc4 \uc758\ubbf8 \uc5c6\ub294 \ub4ef \ud558\ub2e4. sem_post\ud558\ub294 \uc989\uc2dc \uc790\uae30 thread\ub97c \uc2e4\ud589\ud558\ub294\uac8c \uc544\ub2c8\ub77c \ub2e4\ub978 thread\ub85c \uac00\uc11c \ud504\ub85c\uadf8\ub7a8\uc744 \uc2e4\ud589\ud55c\ub2e4. wait\ub85c thread \uc774\ud6c4 \ud589\uc744 \uc798 \ub9c9\ub294 \uac8c \ud575\uc2ec\uc778 \ub4ef \ud558\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/* include main *\/\n#include &lt;pthread.h>\n#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;fcntl.h>\n#include &lt;semaphore.h>\n#include &lt;sys\/stat.h>\n#define\tNBUFF\t 10\n#define\tSEM_MUTEX\t\"mutex\"\t \t\/* these are args to px_ipc_name() *\/\n#define\tSEM_NEMPTY\t\"empty\"\n#define\tSEM_NSTORED\t\"nstored\"\n\nint\t\tnitems;\t\t\t\t\t\/* read-only by producer and consumer *\/\nstruct {\t\/* data shared by producer and consumer *\/\n  int\tbuff[NBUFF];\n  sem_t\t*mutex, *nempty, *nstored;\n} shared;\n\nvoid\t*produce(void *), *consume(void *);\n\nint\nmain(int argc, char **argv)\n{\n\tpthread_t\ttid_produce, tid_consume;\n\tint errno;\n\t\n\n\tif (argc != 2)\n\t\tperror(\"usage: prodcons1 &lt;#items>\");\n\tnitems = atoi(argv[1]);\n\t\t\/* 4create three semaphores *\/\n\tshared.mutex = sem_open(SEM_MUTEX, O_CREAT | O_EXCL,\n\t\t\t\t\t\t\t0660, 1);\n\tshared.nempty = sem_open(SEM_NEMPTY, O_CREAT | O_EXCL,\n\t\t\t\t\t\t\t 0660, NBUFF);\n\tshared.nstored = sem_open(SEM_NSTORED, O_CREAT | O_EXCL,\n\t\t\t\t\t\t\t  0660, 0);\n\n\t\t\/* 4create one producer thread and one consumer thread *\/\n\t\/\/pthread_setconcurrency(2);\n\t\/\/pthread_setconcurrency();\n\tpthread_create(&amp;tid_produce, NULL, produce, NULL);\n\tpthread_create(&amp;tid_consume, NULL, consume, NULL);\n\n\t\t\/* 4wait for the two threads *\/\n\tpthread_join(tid_produce, NULL);\n\tpthread_join(tid_consume, NULL);\n\n\t\t\/* 4remove the semaphores *\/\n\tsem_unlink(SEM_MUTEX);\n\tsem_unlink(SEM_NEMPTY);\n\tsem_unlink(SEM_NSTORED);\n\texit(0);\n}\n\/* end main *\/\n\n\/* include prodcons *\/\nvoid *\nproduce(void *arg)\n{\n\tint\t\ti;\n\tint tmpnempty, tmpmutex, tmpnstored;\n\n\tfor (i = 0; i &lt; nitems; i++) {\n\n\n\t\t\/\/value check\n\t\t\/\/sem_getvalue(shared.nempty, &amp;tmpnempty);\n\t\t\/\/sem_getvalue(shared.nstored, &amp;tmpnstored);\n\t\t\/\/sem_getvalue(shared.mutex, &amp;tmpmutex);\n\n\t\tsem_wait(shared.nempty);\t\/* wait for at least 1 empty slot *\/\n\t\tsem_wait(shared.mutex);\n\n\t\t\/\/value check\n\t\t\/\/sem_getvalue(shared.nempty, &amp;tmpnempty);\n\t\t\/\/sem_getvalue(shared.nstored, &amp;tmpnstored);\n\t\t\/\/sem_getvalue(shared.mutex, &amp;tmpmutex);\n\n\n\n\t\tshared.buff[i % NBUFF] = i;\t\/* store i into circular buffer *\/\n\t\tsem_post(shared.mutex);\n\t\tsem_post(shared.nstored);\t\/* 1 more stored item *\/\n\t\t\/\/value check\n\t\t\/\/sem_getvalue(shared.nempty, &amp;tmpnempty);\n\t\t\/\/sem_getvalue(shared.nstored, &amp;tmpnstored);\n\t\t\/\/sem_getvalue(shared.mutex, &amp;tmpmutex);\n\n\n\t}\n\treturn(NULL);\n}\n\nvoid *\nconsume(void *arg)\n{\n\tint\t\ti;\n\tint tmpnempty, tmpmutex, tmpnstored;\n\n\tfor (i = 0; i &lt; nitems; i++) {\n\t\t\/\/value check\n\t\t\/\/sem_getvalue(shared.nempty, &amp;tmpnempty);\n\t\t\/\/sem_getvalue(shared.mutex, &amp;tmpmutex);\n\t\t\/\/sem_getvalue(shared.nstored, &amp;tmpnstored);\n\n\n\t\tsem_wait(shared.nstored);\t\t\/* wait for at least 1 stored item *\/\n\t\tsem_wait(shared.mutex);\n\t\t\/\/value check\n\t\t\/\/sem_getvalue(shared.nempty, &amp;tmpnempty);\n\t\t\/\/sem_getvalue(shared.mutex, &amp;tmpmutex);\n\t\t\/\/sem_getvalue(shared.nstored, &amp;tmpnstored);\n\n\n\t\tif (shared.buff[i % NBUFF] = i)\n\t\t\tprintf(\"buff[%d] = %d\\n\", i, shared.buff[i % NBUFF]);\n\t\tsem_post(shared.mutex);\n\t\tsem_post(shared.nempty);\t\t\/* 1 more empty slot *\/\n\t\t\/\/value check\n\t\t\/\/sem_getvalue(shared.nempty, &amp;tmpnempty);\n\t\t\/\/sem_getvalue(shared.mutex, &amp;tmpmutex);\n\t\t\/\/sem_getvalue(shared.nstored, &amp;tmpnstored);\n\n\n\t}\n\treturn(NULL);\n}\n\/* end prodcons *\/\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pi@raspberrypi:~\/Project\/cCode\/IPC $ gdb --args .\/a.out  3\nGNU gdb (Raspbian 8.2.1-2) 8.2.1\nCopyright (C) 2018 Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version 3 or later &lt;http:\/\/gnu.org\/licenses\/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\nType \"show copying\" and \"show warranty\" for details.\nThis GDB was configured as \"arm-linux-gnueabihf\".\nType \"show configuration\" for configuration details.\nFor bug reporting instructions, please see:\n&lt;http:\/\/www.gnu.org\/software\/gdb\/bugs\/>.\nFind the GDB manual and other documentation resources online at:\n    &lt;http:\/\/www.gnu.org\/software\/gdb\/documentation\/>.\n\nFor help, type \"help\".\nType \"apropos word\" to search for commands related to \"word\"...\nReading symbols from .\/a.out...done.\n...\n\n(gdb) info b\nNum     Type           Disp Enb Address    What\n1       breakpoint     keep y   0x000107b4 in produce at semaphore.c:72\n\tbreakpoint already hit 3 times\n2       breakpoint     keep y   0x00010884 in consume at semaphore.c:108\n\tbreakpoint already hit 3 times\n(gdb) r\nStarting program: \/home\/pi\/Project\/cCode\/IPC\/a.out 3\n[Thread debugging using libthread_db enabled]\nUsing host libthread_db library \"\/lib\/arm-linux-gnueabihf\/libthread_db.so.1\".\n[New Thread 0xb6e31460 (LWP 2842)]\n[New Thread 0xb6630460 (LWP 2843)]\n[Switching to Thread 0xb6e31460 (LWP 2842)]\n\nThread 2 \"a.out\" hit Breakpoint 1, produce (arg=0x0) at semaphore.c:72\n72\t\t\tsem_wait(shared.nempty);\t\/* wait for at least 1 empty slot *\/\n1: shared = {buff = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, mutex = 0xb6ff8000, \n  nempty = 0xb6ff7000, nstored = 0xb6ff6000}\n2: *shared.nempty = {\n  __size = \"\\024\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 20}\n3: *shared.nstored = {\n  __size = \"\\000\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 0}\n4: *shared.mutex = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n(gdb) c\nContinuing.\n[Switching to Thread 0xb6630460 (LWP 2843)]\n\nThread 3 \"a.out\" hit Breakpoint 2, consume (arg=0x0) at semaphore.c:108\n108\t\t\tsem_wait(shared.nstored);\t\t\/* wait for at least 1 stored item *\/\n1: shared = {buff = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, mutex = 0xb6ff8000, \n  nempty = 0xb6ff7000, nstored = 0xb6ff6000}\n2: *shared.nempty = {\n  __size = \"\\024\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 20}\n3: *shared.nstored = {\n  __size = \"\\000\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 0}\n4: *shared.mutex = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n(gdb) c\nContinuing.\n[Switching to Thread 0xb6e31460 (LWP 2842)]\n\nThread 2 \"a.out\" hit Breakpoint 1, produce (arg=0x0) at semaphore.c:72\n72\t\t\tsem_wait(shared.nempty);\t\/* wait for at least 1 empty slot *\/\n1: shared = {buff = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, mutex = 0xb6ff8000, \n  nempty = 0xb6ff7000, nstored = 0xb6ff6000}\n2: *shared.nempty = {\n  __size = \"\\022\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 18}\n3: *shared.nstored = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n4: *shared.mutex = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n(gdb) c\nContinuing.\n[Switching to Thread 0xb6630460 (LWP 2843)]\n\nThread 3 \"a.out\" hit Breakpoint 2, consume (arg=0x0) at semaphore.c:108\n108\t\t\tsem_wait(shared.nstored);\t\t\/* wait for at least 1 stored item *\/\n1: shared = {buff = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, mutex = 0xb6ff8000, \n  nempty = 0xb6ff7000, nstored = 0xb6ff6000}\n2: *shared.nempty = {\n  __size = \"\\022\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 18}\n3: *shared.nstored = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n4: *shared.mutex = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n(gdb) c\nContinuing.\n[Switching to Thread 0xb6e31460 (LWP 2842)]\n\nThread 2 \"a.out\" hit Breakpoint 1, produce (arg=0x0) at semaphore.c:72\n72\t\t\tsem_wait(shared.nempty);\t\/* wait for at least 1 empty slot *\/\n1: shared = {buff = {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, mutex = 0xb6ff8000, \n  nempty = 0xb6ff7000, nstored = 0xb6ff6000}\n2: *shared.nempty = {\n  __size = \"\\022\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 18}\n3: *shared.nstored = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n4: *shared.mutex = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n(gdb) c\nContinuing.\nbuff[1] = 1\n[Thread 0xb6e31460 (LWP 2842) exited]\n[Switching to Thread 0xb6630460 (LWP 2843)]\n\nThread 3 \"a.out\" hit Breakpoint 2, consume (arg=0x0) at semaphore.c:108\n108\t\t\tsem_wait(shared.nstored);\t\t\/* wait for at least 1 stored item *\/\n1: shared = {buff = {0, 1, 2, 0, 0, 0, 0, 0, 0, 0}, mutex = 0xb6ff8000, \n  nempty = 0xb6ff7000, nstored = 0xb6ff6000}\n2: *shared.nempty = {\n  __size = \"\\022\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 18}\n3: *shared.nstored = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n4: *shared.mutex = {\n  __size = \"\\002\\000\\000\\000\\200\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\", \n  __align = 2}\n(gdb) c\nContinuing.\nbuff[2] = 2\n[Thread 0xb6ffa070 (LWP 2841) exited]\n[Inferior 1 (process 2841) exited normally]\n(gdb) \n<\/pre>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/unix.stackexchange.com\/questions\/275650\/where-is-a-named-semaphore-stored\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>name semaphore\ub294 \/dev\/shm\uc5d0 \uc800\uc7a5\ub41c\ub2e4. \uc774\ub984\uc744 \uc5c4\ud55c \/tmp\/xxx \uc774\ub7f0 \uc2dd\uc73c\ub85c \ub9cc\ub4e4\uba74 \uc138\ub9c8\ud3ec\uc5b4\ub97c \ub9cc\ub4e4 \uc218 \uc5c6\ub2e4. segment error\ub85c \uc8fd\ub294\ub2e4. \ucc45\uc5d0\uc11c\ub294 \/tmp\/\ub85c \ub123\uc5b4\ub3c4 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12],"tags":[775,53,781,784,786],"class_list":["post-3848","post","type-post","status-publish","format-standard","hentry","category-12","tag-c","tag-linux","tag-network-program","tag-pthread","tag-semaphore"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/3848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/comments?post=3848"}],"version-history":[{"count":4,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/3848\/revisions"}],"predecessor-version":[{"id":3856,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/3848\/revisions\/3856"}],"wp:attachment":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=3848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=3848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=3848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}