{"id":3861,"date":"2020-07-20T00:00:34","date_gmt":"2020-07-19T15:00:34","guid":{"rendered":"https:\/\/now0930.pe.kr\/wordpress\/?p=3861"},"modified":"2020-07-22T00:01:24","modified_gmt":"2020-07-21T15:01:24","slug":"%eb%8b%a4%eb%a5%b8-process%ea%b0%84-named-semaphore-%ec%82%ac%ec%9a%a9%ec%8b%a4%ed%8c%a8","status":"publish","type":"post","link":"https:\/\/now0930.pe.kr\/wordpress\/%eb%8b%a4%eb%a5%b8-process%ea%b0%84-named-semaphore-%ec%82%ac%ec%9a%a9%ec%8b%a4%ed%8c%a8\/","title":{"rendered":"\ub2e4\ub978 process\uac04 named semaphore \uc0ac\uc6a9(\uc2e4\ud328)"},"content":{"rendered":"\n<p>\uc138\ub9c8\ud3ec\uc5b4\ub85c \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud560 \uc904 \uc54c\uc558\uc73c\ub098, \ub3d9\uae30\ud654\ub9cc \ud55c\ub2e4. \ud504\ub85c\uc138\uc2a4\uac04 \ub370\uc774\ud130\ub97c \uacf5\uc720\ud560 \ubc29\ubc95\uc774 \uc5c6\ub2e4. \ub2e4\uc74c \uc608\uc81c shared memory\ub85c \uacf5\uc720\ud55c\ub2e4. named semaphore\ub294 \uc798 \ub3d9\uc791\ud558\ub294 \ub4ef \ud55c\ub370, \uac80\uc99d\uc744 \ubabb\ud588\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pi@raspberrypi:~\/Project\/cCode\/IPC $ cat named_semaphore_prod.c \n\/* 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#include &lt;errno.h>\n#include &lt;signal.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#define SEM_PROGEND \"end\"\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, *endprog;\n} shared;\n\n\nstatic void signal_hanlder (int signo)\n{\n\/*\n* Technically, you shouldn't use printf() in a\n* signal handler, but it isn't the end of the\n* world. I'll discuss why in the section\n* \"Reentrancy.\"\n*\/\n  if(signo == SIGINT){\n    printf (\"Caught SIGINT!\\ndelete named semaphore\\n\");\n\tsem_unlink(SEM_MUTEX);\n\tsem_unlink(SEM_NEMPTY);\n\tsem_unlink(SEM_NSTORED);\n\tsem_unlink(SEM_PROGEND);\n    exit (EXIT_SUCCESS);\n  }\n}\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti, items;\n\terrno=0;\n\n\/\/if (argc != 2)\n\/\/\t\tperror(\"usage: prodcons1 &lt;#items>\");\n\/\/\tnitems = atoi(argv[1]);\n\t\t\/* 4create three semaphores *\/\n\n\t\/\/\ubb34\ud55c \ub8e8\ud504\uc5d0\uc11c \uc138\ub9c8\ud3ec\uc5b4 \ub3d9\uc791..\n\t\/\/signal handler\ub85c \uc0ad\uc81c\ud544\uc694.\n\n\tif(signal(SIGINT, signal_hanlder) == SIG_ERR){\n\t\tfprintf(stderr, \"cannot handle SIGINT\\n\");\n\t\texit(EXIT_FAILURE);\n\t}\n\n\n\tshared.mutex = sem_open(SEM_MUTEX, O_CREAT | O_EXCL, 0660, 1);\n\tif(shared.mutex == SEM_FAILED &amp;&amp; errno == EEXIST ){\n\t\tprintf(\"delete existing semaphore mutex\\n\");\n\t\tsem_unlink(SEM_MUTEX);\n\t\tshared.mutex = sem_open(SEM_MUTEX, O_CREAT | O_EXCL, 0660, 1);\n\t} \/\/if\n\n\tshared.nempty = sem_open(SEM_NEMPTY, O_CREAT | O_EXCL, 0660, NBUFF);\n\tif(shared.nempty== SEM_FAILED &amp;&amp; errno == EEXIST ){\n\t\tprintf(\"delete existing semaphore nempty\\n\");\n\t\tsem_unlink(SEM_NEMPTY);\n\t\tshared.nempty = sem_open(SEM_NEMPTY, O_CREAT | O_EXCL, 0660, NBUFF);\n\t} \/\/if\n\n\tshared.nstored = sem_open(SEM_NSTORED, O_CREAT | O_EXCL, 0660, 0);\n\tif(shared.nstored== SEM_FAILED &amp;&amp; errno == EEXIST ){\n\t\tprintf(\"delete existing semaphore nstored\\n\");\n\t\tsem_unlink(SEM_NSTORED);\n\t\tshared.nstored = sem_open(SEM_NSTORED, O_CREAT | O_EXCL, 0660, 0);\n\n\t} \/\/if\n\n\tshared.endprog = sem_open(SEM_PROGEND, O_RDONLY);\n\tif(shared.endprog== SEM_FAILED &amp;&amp; errno == EEXIST ){\n\t\tprintf(\"delete existing semaphore endprog\\n\");\n\t\tsem_unlink(SEM_PROGEND);\n\t\tshared.endprog = sem_open(SEM_PROGEND, O_RDONLY);\n\n\t} \/\/if\n\t\/\/sem_getvalue(shared.endprog, &amp;items);\n\t\/\/printf(\"producer. items are %d.\\n\",items);\n\n\n\twhile(1){\n\n\t\tsem_wait(shared.nempty);\t\/* wait for at least 1 empty slot *\/\n\t\tsem_wait(shared.mutex);\n\t\tshared.buff[i % NBUFF] = i;\t\/* store i into circular buffer *\/\n\t\titems--;\n\t\tsem_post(shared.mutex);\n\t\tsem_post(shared.nstored);\t\/* 1 more stored item *\/\n\n\n\t\t\/\/\ud504\ub85c\uadf8\ub7a8 end \ud655\uc778.\n\t\t\/\/consum\uc5d0\uc11c nitems\ub97c \ubc1b\uc9c0 \ub9d0\uace0,\n\t\t\/\/\ub3d9\uae30\ud654 \uc798 \ub41c\ub2e4\ub294 \uc0dd\uac01\uc73c\ub85c\n\t\t\/\/prod, consum \uc591\ucabd \uce74\uc6b4\ud130..\n\t\t\/\/\ubaa9\ud45c \uce74\uc6b4\ud130 \ub3c4\ub2ec\ud558\uba74 \ubaa8\ub450 \uc885\ub8cc.\n\t\t\/\/if(items&lt;=0) break;\n\t\t\n\t}\n\n\tsem_unlink(SEM_MUTEX);\n\tsem_unlink(SEM_NEMPTY);\n\tsem_unlink(SEM_NSTORED);\n\tsem_unlink(SEM_PROGEND);\n\n\n\treturn 0;\n}<\/pre>\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=\"\">pi@raspberrypi:~\/Project\/cCode\/IPC $ cat named_semaphore_consu.c\n\/* 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#include &lt;errno.h>\n\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#define SEM_PROGEND \"end\"\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, *endprog;\n\n} shared;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti;\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_RDWR);\n\tshared.nempty = sem_open(SEM_NEMPTY, O_RDWR);\n\tshared.nstored = sem_open(SEM_NSTORED, O_RDWR);\n\tshared.endprog = sem_open(SEM_PROGEND, O_CREAT | O_EXCL, 0660, nitems);\n\tif(shared.endprog == SEM_FAILED &amp;&amp; errno == EEXIST ){\n\t\tprintf(\"delete existing semaphore endprog\\n\");\n\t\tsem_unlink(SEM_PROGEND);\n\t\tshared.endprog = sem_open(SEM_PROGEND, O_CREAT | O_EXCL, 0660, nitems);\n\n\t} \/\/if\n\n\tfor (i = 0; i &lt; nitems; i++) {\n\n\t\tsem_wait(shared.nstored);\t\t\/* wait for at least 1 stored item *\/\n\t\tsem_wait(shared.mutex);\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\n\t}\n\treturn 0;\n}<\/pre>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/stackoverflow.com\/questions\/32205396\/share-posix-semaphore-among-multiple-processes\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\uc138\ub9c8\ud3ec\uc5b4\ub85c \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud560 \uc904 \uc54c\uc558\uc73c\ub098, \ub3d9\uae30\ud654\ub9cc \ud55c\ub2e4. \ud504\ub85c\uc138\uc2a4\uac04 \ub370\uc774\ud130\ub97c \uacf5\uc720\ud560 \ubc29\ubc95\uc774 \uc5c6\ub2e4. \ub2e4\uc74c \uc608\uc81c shared memory\ub85c \uacf5\uc720\ud55c\ub2e4. named semaphore\ub294 \uc798 [&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,786],"class_list":["post-3861","post","type-post","status-publish","format-standard","hentry","category-12","tag-c","tag-linux","tag-network-program","tag-semaphore"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/3861","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=3861"}],"version-history":[{"count":2,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/3861\/revisions"}],"predecessor-version":[{"id":3868,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/3861\/revisions\/3868"}],"wp:attachment":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=3861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=3861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=3861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}