{"id":11770,"date":"2026-07-09T16:18:28","date_gmt":"2026-07-09T07:18:28","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11770"},"modified":"2026-07-09T16:59:25","modified_gmt":"2026-07-09T07:59:25","slug":"%eb%a6%ac%eb%88%85%ec%8a%a4-%ec%8b%9c%eb%a6%ac%ec%96%bc-%ed%86%b5%ec%8b%a0-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d-%ea%b0%80%ec%9d%b4%eb%93%9c","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11770","title":{"rendered":"\ub9ac\ub205\uc2a4 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0 \ud504\ub85c\uadf8\ub798\ubc0d \uac00\uc774\ub4dc"},"content":{"rendered":"<h1>\ub9ac\ub205\uc2a4 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0 \ud504\ub85c\uadf8\ub798\ubc0d \uac00\uc774\ub4dc<\/h1>\n<blockquote>\n<p>\ucd9c\ucc98: The Linux Serial-Programming-HOWTO (C) 1997 by Peter Baumann<\/p>\n<\/blockquote>\n<h2>\ub9ac\ub205\uc2a4 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0<\/h2>\n<h3>\ud3ec\ud2b8 \uc138\ud305<\/h3>\n<p>\uc7a5\uce58 \ud30c\uc77c\uc778 <code>\/dev\/ttyS*<\/code>\ub294 \ub9ac\ub205\uc2a4\uc5d0\uc11c \ud130\ubbf8\ub110\uc744 \uc5f0\uacb0\ud558\uae30 \uc704\ud55c \ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \uc774 \uc0ac\uc2e4\uc740 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\ub294 \ub370 \ubc18\ub4dc\uc2dc \uae30\uc5b5\ud574\uc57c \ud560 \uc0ac\ud56d\uc774\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc2dc\ub9ac\uc5bc \ud3ec\ud2b8\ub3c4 \ubb38\uc790 \uc5d0\ucf54\ub97c \ud558\ub3c4\ub85d \uc124\uc815\ub418\uc5b4 \uc788\uc73c\uba70, \uc774 \uc124\uc815\uc740 \ubcf4\ud1b5 \ub370\uc774\ud130 \uc804\uc1a1 \uc2dc\uc5d0 \ubc14\uafd4\uc57c \ud560 \uc0ac\ud56d\uc774\ub2e4.<\/p>\n<p>\ubaa8\ub4e0 \ud30c\ub77c\ubbf8\ud130\ub4e4\uc740 \ud504\ub85c\uadf8\ub7a8 \ucf54\ub4dc\uc5d0\uc11c \uc27d\uac8c \uc124\uc815\ud560 \uc218 \uc788\ub2e4. \ud30c\ub77c\ubbf8\ud130\ub4e4\uc740 <code>&lt;asm\/termbits.h&gt;<\/code>\uc5d0 \uc815\uc758\ub418\uc5b4 \uc788\ub294 <code>struct termios<\/code> \uad6c\uc870\uccb4\uc5d0 \uc800\uc7a5\ub418\uc5b4 \uc788\ub2e4.<\/p>\n<pre><code class=\"language-c\">#define NCCS 19\n\nstruct termios {\n    tcflag_t c_iflag;    \/* input mode flags *\/\n    tcflag_t c_oflag;    \/* output mode flags *\/\n    tcflag_t c_cflag;    \/* control mode flags *\/\n    tcflag_t c_lflag;    \/* local mode flags *\/\n    cc_t     c_line;     \/* line discipline *\/\n    cc_t     c_cc[NCCS]; \/* control characters *\/\n};<\/code><\/pre>\n<h3>\uac01 \ud50c\ub798\uadf8 \uc124\uba85<\/h3>\n<table>\n<thead>\n<tr>\n<th>\ud50c\ub798\uadf8<\/th>\n<th>\uc124\uba85<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>c_iflag<\/code><\/td>\n<td>\uc785\ub825 \ucc98\ub9ac(input processing) \ubc29\uc2dd \uc815\uc758. <code>read()<\/code>\ub85c \uc77d\uae30 \uc804\uc5d0 \uc218\uc2e0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 \ubc29\ubc95 \uc124\uc815<\/td>\n<\/tr>\n<tr>\n<td><code>c_oflag<\/code><\/td>\n<td>\ucd9c\ub825 \ucc98\ub9ac(output processing) \ubc29\uc2dd \uc815\uc758<\/td>\n<\/tr>\n<tr>\n<td><code>c_cflag<\/code><\/td>\n<td>baudrate, data bits, stop bits \ub4f1\uc758 \ud3ec\ud2b8 \uc124\uc815<\/td>\n<\/tr>\n<tr>\n<td><code>c_lflag<\/code><\/td>\n<td>echo \uc5ec\ubd80 \ub4f1 \ub85c\uceec \ub3d9\uc791 \uacb0\uc815<\/td>\n<\/tr>\n<tr>\n<td><code>c_cc[]<\/code><\/td>\n<td>EOF, STOP \ub4f1 \uc81c\uc5b4 \ub3d9\uc791\uc5d0 \uc0ac\uc6a9\ud560 \ubb38\uc790 \uc815\uc758<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote>\n<p><code>c_line<\/code> \ud56d\ubaa9\uc740 POSIX \ud638\ud658 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \uc0ac\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4.<br \/>\n\uac01 \ud50c\ub798\uadf8\uc758 \uc0c1\uc138 \uc124\uba85\uc740 <code>termios(3)<\/code> man page\ub97c \ucc38\uc870\ud558\ub77c.<\/p>\n<\/blockquote>\n<h3>Control Modes(c_cflags)<\/h3>\n<ul>\n<li>PARENB (Parity)<br \/>\nPARENB\uac00 \uc138\ud305\ub418\uba74 parity bit\uc774 enable\ub41c\ub2e4. \ub300\ubd80\ubd84\uc758 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0\uc740 parity bit\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c \ud655\uc2e4\ud558\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uc5d0\ub294 \uc774 bit\ub97c clear\ud558\ub3c4\ub85d \ud55c\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_cflag &amp;= ~PARENB; \/\/ Clear parity bit, disabling parity (most common)\ntty.c_cflag |= PARENB;  \/\/ Set parity bit, enabling parity<\/code><\/pre>\n<ul>\n<li>CSTOPB (Num.Stop Bit)<br \/>\nCSTOPB\uac00 \uc138\ud305\ub418\uba74 2\uac1c\uc758 stop bit\uac00 \uc0ac\uc6a9\ub41c\ub2e4. \uc774 bit\uac00 clear\ub418\uba74 \ud558\ub098\uc758 stop bit\uac00 \uc0ac\uc6a9\ub41c\ub2e4. \ub300\ubd80\ubd84\uc758 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0\uc5d0\uc11c\ub294 \ud558\ub098\uc758 stop bit\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_cflag &amp;= ~CSTOPB; \/\/ Clear stop field, only one stop bit used in communication (most common)\ntty.c_cflag |= CSTOPB;  \/\/ Set stop field, two stop bits used in communication<\/code><\/pre>\n<ul>\n<li>Number of Bits Per Byte<br \/>\nCS<number> field\uc5d0\ub294 \uba87\uac1c\uc758 data bit\uac00 \ud55c \ubc14\uc774\ud2b8 \ub2f9 \uc804\uc1a1\ub420\uac83 \uc778\uc9c0\ub97c \uc124\uc815\ud55c\ub2e4. \ub300\ubd80\ubd84\uc758 \uc138\ud305\uc740 8(CS8)\uc774\uba70 \ubc14\uc774\ud2b8 \ub2f9 \uba87\uac1c\uc758 data-bit\ub97c \uc0ac\uc6a9\ud560 \uac83\uc778\uc9c0 \uc124\uc815\ud558\uae30 \uc804\uc5d0 &amp;= ~CSIZE\ub85c clear\ud574\uc918\uc57c \ud55c\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_cflag &amp;= ~CSIZE; \/\/ Clear all the size bits, then use one of the statements below\ntty.c_cflag |= CS5; \/\/ 5 bits per byte\ntty.c_cflag |= CS6; \/\/ 6 bits per byte\ntty.c_cflag |= CS7; \/\/ 7 bits per byte\ntty.c_cflag |= CS8; \/\/ 8 bits per byte (most common)<\/code><\/pre>\n<ul>\n<li>CRTSCTS (Flow Control)<br \/>\nCRTSCTS field\uac00 \uc138\ud305\ub418\uba74 \ud558\ub4dc\uc6e8\uc5b4 RTS\/CTS\uac00 enable\ub41c\ub2e4. \uc774 field\uac00 disable\ub418\uc57c \ud558\ub294 \uc0c1\ud669\uc5d0\uc11c enable\ub418\uba74 sender\ucabd\uc5d0\uc11c\ub294 \uc0c1\ub300\uac00 ready \uc0c1\ud0dc\uac00 \ub418\uae30\ub97c \uae30\ub2e4\ub9ac\uba70 \ubb34\ud55c\uc815 buffer\ub3d9\uc791\uc744 \uc218\ud589\ud558\ubbc0\ub85c \uc2dc\ub9ac\uc5bc \ud3ec\ud2b8\uc5d0\uc11c \ub370\uc774\ud130 \uc218\uc2e0\uc774 \ubd88\uac00\ub2a5\ud558\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">ty.c_cflag &amp;= ~CRTSCTS; \/\/ Disable RTS\/CTS hardware flow control (most common)\ntty.c_cflag |= CRTSCTS;  \/\/ Enable RTS\/CTS hardware flow control<\/code><\/pre>\n<ul>\n<li>CREAD &amp; CLOCAL<br \/>\nCLOCAL\uc744 \uc138\ud305\ud558\uba74 carrier detect\uc640 \uac19\uc740 modem-specific\ud55c \uc2dc\uadf8\ub110\uc744 disable\ud558\uac8c \ub418\uba70 controlling process\uac00 modem\uc774 \uc5f0\uacb0 \ud574\uc81c \ub418\ub294\uac83\uc744 \uac10\uc9c0\ud560 \ub54c SIGHUP \uc2e0\ud638\ub97c \ubc1b\uc744 \uc218 \uc5c6\uac8c \ud55c\ub2e4. CREAD\ub97c \uc138\ud305\ud558\uba74 \ub370\uc774\ud130\ub97c read\ud560 \uc218 \uc788\uac8c \ub41c\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_cflag |= CREAD | CLOCAL; \/\/ Turn on READ &amp; ignore ctrl lines (CLOCAL = 1)<\/code><\/pre>\n<h3>Local Modes(c_lflag)<\/h3>\n<ul>\n<li>Disabling Canonical Mode<br \/>\nUNIX \uc2dc\uc2a4\ud15c\uc740 canonical, non-canonical \ub450\uac1c\uc758 basic input mode\ub97c \uc81c\uacf5\ud55c\ub2e4. Canononical mode\uc5d0\uc11c\ub294 \uc0c8\ub85c\uc6b4 line character\uac00 \uc218\uc2e0\ub420 \ub54c\ub9c8\ub2e4 input\uc744 \ucc98\ub9ac\ud558\uace0 receiving application\uc5d0\uc11c\ub294 \uc774\ub97c line-by-line\uc73c\ub85c \ucc98\ub9ac\ud55c\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc740 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0\uc5d0\uc11c\ub294 \ubc14\ub78c\uc9c1\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c \ubcf4\ud1b5 canonical mode\ub97c disable\ud55c\ub2e4. \ub610\ud55c canonical mode\uc5d0\uc11c\ub294 backspace\uc640 \uac19\uc740 \uac83\ub4e4\uc740 \ud604\uc7ac\uc758 \ud14d\uc2a4\ud2b8 line\uc744 \uc218\uc815\ud558\ub294\ub370 \uc4f0\uc774\ubbc0\ub85c serial data\ub97c \ucc98\ub9ac\ud560 \ub54c backspace\ub85c \uc778\ud574 \ud2b9\uc815 byte\ub4e4\uc774 \uc0ac\ub77c\uc9c0\ub294 \uacbd\uc6b0\ub97c \ub9c9\uae30 \uc704\ud574 canonical mode\ub97c disable \ud55c\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_lflag &amp;= ~ICANON; \/\/canonical mode is disabled.<\/code><\/pre>\n<ul>\n<li>Echo<br \/>\nEcho-bit \uc774 \uc138\ud305\ub418\uba74 \ubcf4\ub0b8 character\ub4e4\uc774 \ub2e4\uc2dc \ub418\ub3cc\uc544\uc628\ub2e4.(echoed back)<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_lflag &amp;= ~ECHO; \/\/ Disable echo\ntty.c_lflag &amp;= ~ECHOE; \/\/ Disable erasure\ntty.c_lflag &amp;= ~ECHONL; \/\/ Disable new-line echo<\/code><\/pre>\n<ul>\n<li>Disable Signal Chars<br \/>\nISIG bit\uac00 \uc138\ud305\ub418\uba74 INTR, QUIT, SUSP\uac00 interpret\ub418\uba70 \uc774\ub7ec\ud55c \uc0c1\ud669\uc740 serial port\uc5d0\uc11c \ubc14\ub78c\uc9c1\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c ISIG bit\ub97c clear\ud55c\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_lflag &amp;= ~ISIG; \/\/ Disable interpretation of INTR, QUIT and SUSP<\/code><\/pre>\n<h3>Input Modes(c_iflag)<\/h3>\n<ul>\n<li>Software Flow Control ( IXOFF, IXON, IXANY)<br \/>\nIXOFF, IXON, IXANY\ub97c clear\ud558\uba74 software flow control\uc744 disable\ud55c\ub2e4. (Serial \ud1b5\uc2e0\uc5d0\uc11c disable\ud544\uc694)<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_iflag &amp;= ~(IXON | IXOFF | IXANY); \/\/ Turn off s\/w flow ctrl<\/code><\/pre>\n<ul>\n<li>Disabling Special Handling of Bytes on Receive<br \/>\nraw data\ub9cc\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \uc544\ub798\uc758 bit\ub4e4\uc744 \ubaa8\ub450 clear\ud558\uc5ec special handling byte\ub4e4\uc744 \ubaa8\ub450 disable\ud55c\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">tty.c_iflag &amp;= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL); \/\/ Disable any special handling of received bytes<\/code><\/pre>\n<h3>Output Modes(c_oflag)<\/h3>\n<p>termios struct\uba64\ubc84\uc778 c_oflag\ub294 output\ucc98\ub9ac\uc5d0 \ub300\ud55c low-level \uc138\ud305\uc5d0 \uad00\ud55c \uc815\ubcf4\ub97c \ub2f4\uace0 \uc788\ub2e4. Serial \ud1b5\uc2e0\uc5d0\uc11c\ub294 \ubaa8\ub4e0 output chars\/bytes\uc5d0 \ub300\ud55c special handling\uc744 disable \ud574\uc57c \ud558\ubbc0\ub85c \uc544\ub798\uc758 bit\ub4e4\uc744 \ubaa8\ub450 clear\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-c\">tty.c_oflag &amp;= ~OPOST; \/\/ Prevent special interpretation of output bytes (e.g. newline chars)\ntty.c_oflag &amp;= ~ONLCR; \/\/ Prevent conversion of newline to carriage return\/line feed\n\/\/ tty.c_oflag &amp;= ~OXTABS; \/\/ Prevent conversion of tabs to spaces (NOT PRESENT IN LINUX)\n\/\/ tty.c_oflag &amp;= ~ONOEOT; \/\/ Prevent removal of C-d chars (0x004) in output (NOT PRESENT IN LINUX)<\/code><\/pre>\n<p>OXTABS\uc640 ONOEOT\ub294 Linux\uc5d0\uc11c\ub294 \uc815\uc758\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc9c0\ub9cc Linux\uc5d0\uc11c\ub294 XTABS field\ub97c \ud1b5\ud574 \uad00\ub828\ub41c \uc77c\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4. <\/p>\n<hr \/>\n<h3>\uc2dc\ub9ac\uc5bc \uc7a5\uce58\uc758 \uc785\ub825 \ubc29\ubc95<\/h3>\n<blockquote>\n<p>\ud55c \ubb38\uc790\uc529 \uc77d\ub294 \ub8e8\ud504\ub85c \uc804\uccb4 \ubb38\uc790\uc5f4\uc744 \ubc1b\ub294 \ubc29\ubc95\uc740 <strong>\ubb38\uc790 \uc190\uc2e4\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c<\/strong> \uac00\ub2a5\ud558\uba74 \ud53c\ud558\uace0, \uc804\uccb4 \ubb38\uc790\uc5f4\uc744 \ud55c \ubc88\uc5d0 \uc77d\ub294 \ubc29\uc2dd\uc744 \uad8c\uc7a5\ud55c\ub2e4.<\/p>\n<\/blockquote>\n<h4>Canonical \uc785\ub825 \ucc98\ub9ac (Canonical Input Processing)<\/h4>\n<p>\ud130\ubbf8\ub110\uc758 \uae30\ubcf8 \ucc98\ub9ac \ubc29\ubc95\uc73c\ub85c, <strong>\ud55c \uc904 \ub2e8\uc704<\/strong>\ub85c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud55c\ub2e4. \ud55c \uc904\uc758 \uc885\ub8cc\ub294 \ub2e4\uc74c \ubb38\uc790\ub85c \ud310\ub2e8\ud55c\ub2e4.<\/p>\n<ul>\n<li>NL (New Line, ASCII LF)<\/li>\n<li>EOF (End of File)<\/li>\n<li>EOL (End of Line)<\/li>\n<\/ul>\n<blockquote>\n<p>CR(Carriage Return) \ubb38\uc790\ub294 \ub514\ud3f4\ud2b8 \uc124\uc815\uc5d0\uc11c \uc904 \uc885\ub8cc\ub85c \uc778\uc2dd\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<\/blockquote>\n<p>\uc774 \ubaa8\ub4dc\uc5d0\uc11c\ub294 ERASE, DELETE WORD, REPRINT \ubb38\uc790 \ucc98\ub9ac\uc640 CR \u2192 NL \ubcc0\ud658\ub3c4 \uac00\ub2a5\ud558\ub2e4.<\/p>\n<hr \/>\n<h4>Non-Canonical \uc785\ub825 \ucc98\ub9ac (Non-Canonical Input Processing)<\/h4>\n<p>\ud55c \ubc88 \uc77d\uc744 \ub54c\ub9c8\ub2e4 <strong>\uc815\ud574\uc9c4 \ud06c\uae30\uc758 \ubb38\uc790\ub9cc<\/strong> \uc77d\uc5b4\ub0b8\ub2e4. \ud0c0\uc774\uba38\ub97c \uc124\uc815\ud558\uc5ec \uc77c\uc815 \uc2dc\uac04 \ub0b4\uc5d0 <code>read()<\/code>\uac00 \ub9ac\ud134\ud558\uc9c0 \uc54a\uc73c\uba74 \uac15\uc81c \ub9ac\ud134\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\uc124\uc815 \ud30c\ub77c\ubbf8\ud130\ub294 <code>c_cc[VTIME]<\/code>\uacfc <code>c_cc[VMIN]<\/code> \ub450 \uac00\uc9c0\uc774\ub2e4.<\/p>\n<table>\n<thead>\n<tr>\n<th>\uc870\uac74<\/th>\n<th>\ub3d9\uc791<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>MIN &gt; 0, TIME = 0<\/td>\n<td>MIN\uac1c\uc758 \ubb38\uc790\uac00 \uc62c \ub54c\uae4c\uc9c0 \ubb34\ud55c \ub300\uae30 \ud6c4 \ub9ac\ud134<\/td>\n<\/tr>\n<tr>\n<td>MIN = 0, TIME &gt; 0<\/td>\n<td>TIME \u00d7 0.1\ucd08 \ud0c0\uc784\uc544\uc6c3. \uadf8 \uc804\uc5d0 \ubb38\uc790\uac00 \uc624\uba74 \uc989\uc2dc \ub9ac\ud134<\/td>\n<\/tr>\n<tr>\n<td>MIN &gt; 0, TIME &gt; 0<\/td>\n<td>MIN\uac1c \uc774\uc0c1\uc758 \ubb38\uc790\uac00 \uc624\uac70\ub098 \ubb38\uc790 \uac04 \uac04\uaca9\uc774 TIME \ucd08\uacfc \uc2dc \ub9ac\ud134<\/td>\n<\/tr>\n<tr>\n<td>MIN = 0, TIME = 0<\/td>\n<td>\uc989\uc2dc \ub9ac\ud134. \ud604\uc7ac \uc77d\uc744 \uc218 \uc788\ub294 \ubb38\uc790 \uc218\ub9cc\ud07c \ubc18\ud658<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h4>\ube44\ub3d9\uae30 \uc785\ub825<\/h4>\n<p>\uc704 \ub450 \ubaa8\ub4dc\ub294 \ub3d9\uae30\/\ube44\ub3d9\uae30 \ubc29\uc2dd \ubaa8\ub450 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub2e4.<\/p>\n<ul>\n<li><strong>\ub3d9\uae30 \ubc29\uc2dd<\/strong> (\uae30\ubcf8\uac12): <code>read()<\/code>\uc758 \uc870\uac74\uc774 \ub9cc\uc871\ub420 \ub54c\uae4c\uc9c0 block<\/li>\n<li><strong>\ube44\ub3d9\uae30 \ubc29\uc2dd<\/strong>: <code>read()<\/code>\uac00 \uc989\uc2dc \ub9ac\ud134\ub418\uba70, \ub370\uc774\ud130 \uc218\uc2e0 \uc2dc signal handler\ub85c \uc2dc\uadf8\ub110 \uc804\ub2ec<\/li>\n<\/ul>\n<hr \/>\n<h4>\uc785\ub825 \uc7a5\uce58 \uba40\ud2f0\ud50c\ub809\uc2f1<\/h4>\n<p>\uc5ec\ub7ec \uc7a5\uce58(\uc608: TCP\/IP \uc18c\ucf13 + \uc2dc\ub9ac\uc5bc \ud3ec\ud2b8)\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 \uc785\ub825\uc744 \ubc1b\uc544\uc57c \ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<p><code>select()<\/code> \uc2dc\uc2a4\ud15c \ud638\ucd9c\uc744 \uc0ac\uc6a9\ud558\uba74 CPU \ubd80\ud558 \uc5c6\uc774 \uc5ec\ub7ec \uc785\ub825\uc744 \ub300\uae30\ud560 \uc218 \uc788\ub2e4.<\/p>\n<blockquote>\n<p>\ub8e8\ud504\ub97c \ub3cc\uba74\uc11c \uc785\ub825 \uc5ec\ubd80\ub97c \uccb4\ud06c\ud558\ub294 <strong>polling \ubc29\uc2dd\uc740 CPU \ubd80\ud558\ub97c \uc720\ubc1c<\/strong>\ud558\uc5ec \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uc758 \uc131\ub2a5\uc744 \uc800\ud558\uc2dc\ud0a8\ub2e4.<\/p>\n<\/blockquote>\n<hr \/>\n<h2>\ud504\ub85c\uadf8\ub7a8 \uc608\uc81c<\/h2>\n<blockquote>\n<p>\ubaa8\ub4e0 \uc608\uc81c\ub294 <code>miniterm.c<\/code>\uc5d0\uc11c \ubc1c\ucdcc\ud558\uc600\ub2e4.<br \/>\nCanonical \ubaa8\ub4dc\uc5d0\uc11c \ucc98\ub9ac \uac00\ub2a5\ud55c \ucd5c\ub300 \ubb38\uc790 \uc218\ub294 <strong>255\uc790<\/strong>(<code>&lt;linux\/limits.h&gt;<\/code> \ucc38\uc870)\uc774\ub2e4.<\/p>\n<\/blockquote>\n<p>\uc2dc\ub9ac\uc5bc \ud3ec\ud2b8 \uc7a5\uce58 \ud30c\uc77c\uacfc \ud30c\uc77c \uc811\uadfc \uad8c\ud55c\uc744 \ubc18\ub4dc\uc2dc \ud655\uc778\ud558\ub77c.<\/p>\n<pre><code class=\"language-bash\">chmod a+rw \/dev\/ttyS1<\/code><\/pre>\n<hr \/>\n<h3>\uc608\uc81c 1: Canonical \uc785\ub825 \ucc98\ub9ac<\/h3>\n<p>CRTSCTS : \ud558\ub4dc\uc6e8\uc5b4 \ud750\ub984 \uc81c\uc5b4.<br \/>\n\uc2dc\ub9ac\uc5bc \ucf00\uc774\ube14\uc774 \ubaa8\ub4e0 \ud540\uc5d0 \uc5f0\uacb0\ub418\uc5b4 \uc788\ub294 \uacbd\uc6b0\ub9cc \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud55c\ub2e4.<br \/>\n(Serial-HOWTO\uc758 7\uc7a5\uc744 \ucc38\uc870)<\/p>\n<p>\ud540\uc774 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc740 \uc0c1\ud0dc\uc5d0\uc11c \ud65c\uc131\ud654\ud558\uba74 \uc624\uc791\ub3d9\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-c\">#include &lt;sys\/types.h&gt;\n#include &lt;sys\/stat.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;termios.h&gt;\n#include &lt;stdio.h&gt;\n\n\/* Baudrate \uc124\uc815\uc740 &lt;asm\/termbits.h&gt;\uc5d0 \uc815\uc758 (&lt;termios.h&gt;\uc5d0\uc11c include\ub428) *\/\n#define BAUDRATE B38400\n\/* COM1=&quot;\/dev\/ttyS1&quot;, COM2=&quot;\/dev\/ttyS2&quot; *\/\n#define MODEMDEVICE &quot;\/dev\/ttyS1&quot;\n#define _POSIX_SOURCE 1  \/* POSIX \ud638\ud658 \uc18c\uc2a4 *\/\n#define FALSE 0\n#define TRUE  1\n\nvolatile int STOP = FALSE;\n\nint main()\n{\n    int fd, c, res;\n    struct termios oldtio, newtio;\n    char buf[255];\n\n    \/*\n     * \uc77d\uae30\/\uc4f0\uae30 \ubaa8\ub4dc\ub85c \uc7a5\uce58\ub97c \uc5f0\ub2e4 (O_RDWR)\n     * O_NOCTTY: CTRL-C \ub4f1\uc774 \ud504\ub85c\uadf8\ub7a8\uc744 \uc885\ub8cc\ud558\uc9c0 \uc54a\ub3c4\ub85d controlling tty \ubc29\uc9c0\n     *\/\n    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);\n    if (fd &lt; 0) { perror(MODEMDEVICE); exit(-1); }\n\n    tcgetattr(fd, &amp;oldtio);          \/* \ud604\uc7ac \ud3ec\ud2b8 \uc124\uc815 \uc800\uc7a5 *\/\n    bzero(&amp;newtio, sizeof(newtio));  \/* \uc0c8 \uc124\uc815 \uad6c\uc870\uccb4 \ucd08\uae30\ud654 *\/\n\n    \/*\n     * BAUDRATE : \uc804\uc1a1 \uc18d\ub3c4 (cfsetispeed\/cfsetospeed\ub85c\ub3c4 \uc124\uc815 \uac00\ub2a5)\n     * CRTSCTS  : \ud558\ub4dc\uc6e8\uc5b4 \ud750\ub984 \uc81c\uc5b4 (\ubaa8\ub4e0 \ud540 \uc5f0\uacb0 \uc2dc\uc5d0\ub9cc \uc0ac\uc6a9)\n     * CS8      : 8N1 (8bit, no parity, 1 stopbit)\n     * CLOCAL   : \ub85c\uceec \uc5f0\uacb0 (\ubaa8\ub380 \uc81c\uc5b4 \uc548 \ud568)\n     * CREAD    : \ubb38\uc790 \uc218\uc2e0 \ud65c\uc131\ud654\n     *\/\n    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;\n\n    \/*\n     * IGNPAR : parity \uc5d0\ub7ec \ubb38\uc790 \ubb34\uc2dc\n     * ICRNL  : CR \ubb38\uc790\ub97c NL \ubb38\uc790\ub85c \ubcc0\ud658\n     *\/\n    newtio.c_iflag = IGNPAR | ICRNL;\n\n    newtio.c_oflag = 0;         \/* Raw output *\/\n    newtio.c_lflag = ICANON;    \/* Canonical \uc785\ub825 \ud65c\uc131\ud654, echo \ube44\ud65c\uc131\ud654 *\/\n\n    \/* \uc81c\uc5b4 \ubb38\uc790 \ucd08\uae30\ud654 *\/\n    newtio.c_cc[VINTR]    = 0;  \/* Ctrl-c *\/\n    newtio.c_cc[VQUIT]    = 0;  \/* Ctrl-\\ *\/\n    newtio.c_cc[VERASE]   = 0;  \/* del *\/\n    newtio.c_cc[VKILL]    = 0;  \/* @ *\/\n    newtio.c_cc[VEOF]     = 4;  \/* Ctrl-d *\/\n    newtio.c_cc[VTIME]    = 0;  \/* inter-character timer \ubbf8\uc0ac\uc6a9 *\/\n    newtio.c_cc[VMIN]     = 1;  \/* 1\ubb38\uc790 \uc62c \ub54c\uae4c\uc9c0 blocking *\/\n    newtio.c_cc[VSWTC]    = 0;  \/* &#039;\\0&#039; *\/\n    newtio.c_cc[VSTART]   = 0;  \/* Ctrl-q *\/\n    newtio.c_cc[VSTOP]    = 0;  \/* Ctrl-s *\/\n    newtio.c_cc[VSUSP]    = 0;  \/* Ctrl-z *\/\n    newtio.c_cc[VEOL]     = 0;  \/* &#039;\\0&#039; *\/\n    newtio.c_cc[VREPRINT] = 0;  \/* Ctrl-r *\/\n    newtio.c_cc[VDISCARD] = 0;  \/* Ctrl-u *\/\n    newtio.c_cc[VWERASE]  = 0;  \/* Ctrl-w *\/\n    newtio.c_cc[VLNEXT]   = 0;  \/* Ctrl-v *\/\n    newtio.c_cc[VEOL2]    = 0;  \/* &#039;\\0&#039; *\/\n\n    tcflush(fd, TCIFLUSH);\n    tcsetattr(fd, TCSANOW, &amp;newtio);\n\n    \/* \uccab \ubb38\uc790\uac00 &#039;z&#039;\uc774\uba74 \uc885\ub8cc *\/\n    while (STOP == FALSE) {\n        res = read(fd, buf, 255);\n        buf[res] = 0;  \/* null \uc885\ub8cc \ubb38\uc790 \ucd94\uac00 *\/\n        printf(&quot;:%s:%d\\n&quot;, buf, res);\n        if (buf[0] == &#039;z&#039;) STOP = TRUE;\n    }\n\n    tcsetattr(fd, TCSANOW, &amp;oldtio);  \/* \uc774\uc804 \ud3ec\ud2b8 \uc124\uc815 \ubcf5\uc6d0 *\/\n    return 0;\n}<\/code><\/pre>\n<hr \/>\n<h3>Non-Canonical \uc785\ub825 \ucc98\ub9ac<\/h3>\n<pre><code class=\"language-c\">#include &lt;sys\/types.h&gt;\n#include &lt;sys\/stat.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;termios.h&gt;\n#include &lt;stdio.h&gt;\n\n#define BAUDRATE    B38400\n#define MODEMDEVICE &quot;\/dev\/ttyS1&quot;\n#define _POSIX_SOURCE 1\n#define FALSE 0\n#define TRUE  1\n\nvolatile int STOP = FALSE;\n\nmain()\n{\n    int fd, c, res;\n    struct termios oldtio, newtio;\n    char buf[255];\n\n    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);\n    if (fd &lt; 0) { perror(MODEMDEVICE); exit(-1); }\n\n    tcgetattr(fd, &amp;oldtio);\n\n    bzero(&amp;newtio, sizeof(newtio));\n    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;\n    newtio.c_iflag = IGNPAR;\n    newtio.c_oflag = 0;\n    newtio.c_lflag = 0;  \/* Non-canonical, echo \uc5c6\uc74c *\/\n\n    newtio.c_cc[VTIME] = 0;  \/* inter-character \ud0c0\uc774\uba38 \ube44\ud65c\uc131\ud654 *\/\n    newtio.c_cc[VMIN]  = 5;  \/* \ucd5c\uc18c 5\ubb38\uc790 \uc218\uc2e0 \uc804\uae4c\uc9c0 blocking *\/\n\n    tcflush(fd, TCIFLUSH);\n    tcsetattr(fd, TCSANOW, &amp;newtio);\n\n    while (STOP == FALSE) {\n        res = read(fd, buf, 255);  \/* \ucd5c\uc18c 5\ubb38\uc790 \uc218\uc2e0 \uc2dc \ub9ac\ud134 *\/\n        buf[res] = 0;\n        printf(&quot;:%s:%d\\n&quot;, buf, res);\n        if (buf[0] == &#039;z&#039;) STOP = TRUE;\n    }\n\n    tcsetattr(fd, TCSANOW, &amp;oldtio);\n}<\/code><\/pre>\n<hr \/>\n<h3>\ube44\ub3d9\uae30 \uc785\ub825<\/h3>\n<pre><code class=\"language-c\">#include &lt;termios.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;sys\/signal.h&gt;\n#include &lt;sys\/types.h&gt;\n\n#define BAUDRATE    B38400\n#define MODEMDEVICE &quot;\/dev\/ttyS1&quot;\n#define _POSIX_SOURCE 1\n#define FALSE 0\n#define TRUE  1\n\nvolatile int STOP = FALSE;\n\nvoid signal_handler_IO(int status);  \/* signal handler \uc120\uc5b8 *\/\nint wait_flag = TRUE;                \/* \uc2dc\uadf8\ub110 \uc218\uc2e0 \uc804\uae4c\uc9c0 TRUE *\/\n\nmain()\n{\n    int fd, c, res;\n    struct termios oldtio, newtio;\n    struct sigaction saio;\n    char buf[255];\n\n    \/* Non-blocking \ubaa8\ub4dc\ub85c \uc2dc\ub9ac\uc5bc \uc7a5\uce58 \uc624\ud508 *\/\n    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);\n    if (fd &lt; 0) { perror(MODEMDEVICE); exit(-1); }\n\n    \/* \ube44\ub3d9\uae30 \ubaa8\ub4dc \uc804\ud658 \uc804\uc5d0 signal handler \uc124\uce58 *\/\n    saio.sa_handler  = signal_handler_IO;\n    saio.sa_mask     = 0;\n    saio.sa_flags    = 0;\n    saio.sa_restorer = NULL;\n    sigaction(SIGIO, &amp;saio, NULL);\n\n    fcntl(fd, F_SETOWN, getpid());   \/* SIGIO \uc218\uc2e0 \ub4f1\ub85d *\/\n    fcntl(fd, F_SETFL, FASYNC);      \/* \ube44\ub3d9\uae30 \ubaa8\ub4dc \ud65c\uc131\ud654 *\/\n\n    tcgetattr(fd, &amp;oldtio);\n    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;\n    newtio.c_iflag = IGNPAR | ICRNL;\n    newtio.c_oflag = 0;\n    newtio.c_lflag = ICANON;\n    newtio.c_cc[VMIN]  = 1;\n    newtio.c_cc[VTIME] = 0;\n    tcflush(fd, TCIFLUSH);\n    tcsetattr(fd, TCSANOW, &amp;newtio);\n\n    while (STOP == FALSE) {\n        printf(&quot;.\\n&quot;); usleep(100000);\n        \/* SIGIO \uc218\uc2e0 \ud6c4 wait_flag\uac00 FALSE\uac00 \ub418\uba74 \ub370\uc774\ud130 \uc77d\uae30 *\/\n        if (wait_flag == FALSE) {\n            res = read(fd, buf, 255);\n            buf[res] = 0;\n            printf(&quot;:%s:%d\\n&quot;, buf, res);\n            if (res == 1) STOP = TRUE;  \/* CR\ub9cc \uc785\ub825\ub418\uba74 \uc885\ub8cc *\/\n            wait_flag = TRUE;\n        }\n    }\n\n    tcsetattr(fd, TCSANOW, &amp;oldtio);\n}\n\n\/*\n * signal handler: wait_flag\ub97c FALSE\ub85c \uc124\uc815\ud558\uc5ec\n * \uba54\uc778 \ub8e8\ud504\uc5d0 \ub370\uc774\ud130 \uc218\uc2e0\uc744 \uc54c\ub9b0\ub2e4.\n *\/\nvoid signal_handler_IO(int status)\n{\n    printf(&quot;received SIGIO signal.\\n&quot;);\n    wait_flag = FALSE;\n}<\/code><\/pre>\n<hr \/>\n<h3>\uc785\ub825 \uc7a5\uce58 \uba40\ud2f0\ud50c\ub809\uc2f1<\/h3>\n<p><code>select()<\/code>\ub97c \uc0ac\uc6a9\ud558\uba74 <strong>\uc5ec\ub7ec \ud30c\uc77c \ub514\uc2a4\ud06c\ub9bd\ud130<\/strong>\ub97c \ub3d9\uc2dc\uc5d0 \uac10\uc2dc\ud560 \uc218 \uc788\ub2e4. \uc774 \ubc29\ubc95\uc740 \uc2dc\ub9ac\uc5bc \ud3ec\ud2b8\ubfd0\ub9cc \uc544\ub2c8\ub77c \ud30c\uc77c \ub514\uc2a4\ud06c\ub9bd\ud130\ub97c \uc0ac\uc6a9\ud558\ub294 \ubaa8\ub4e0 \uc785\ucd9c\ub825\uc5d0 \uc801\uc6a9 \uac00\ub2a5\ud558\ub2e4.<\/p>\n<pre><code class=\"language-c\">#include &lt;sys\/time.h&gt;\n#include &lt;sys\/types.h&gt;\n#include &lt;unistd.h&gt;\n\nmain()\n{\n    int    fd1, fd2;\n    fd_set readfs;\n    int    maxfd;\n    int    loop = 1;\n\n    fd1 = open_input_source(&quot;\/dev\/ttyS1&quot;);  \/* COM2 *\/\n    if (fd1 &lt; 0) exit(0);\n    fd2 = open_input_source(&quot;\/dev\/ttyS2&quot;);  \/* COM3 *\/\n    if (fd2 &lt; 0) exit(0);\n\n    maxfd = MAX(fd1, fd2) + 1;\n\n    while (loop) {\n        FD_SET(fd1, &amp;readfs);\n        FD_SET(fd2, &amp;readfs);\n        select(maxfd, &amp;readfs, NULL, NULL, NULL);  \/* \uc785\ub825 \ub300\uae30 *\/\n\n        if (FD_ISSET(fd1, &amp;readfs))\n            handle_input_from_source1();\n        if (FD_ISSET(fd2, &amp;readfs))\n            handle_input_from_source2();\n    }\n}<\/code><\/pre>\n<h4>\ud0c0\uc784\uc544\uc6c3 \uc124\uc815 \ubc29\ubc95<\/h4>\n<pre><code class=\"language-c\">int res;\nstruct timeval Timeout;\n\n\/* select() \ud638\ucd9c\ub9c8\ub2e4 \uac12\uc744 \uc7ac\uc124\uc815\ud574\uc57c \ud55c\ub2e4 (select\uac00 \uac12\uc744 \uac10\uc18c\uc2dc\ud0b4) *\/\nTimeout.tv_usec = 0;  \/* \ub9c8\uc774\ud06c\ub85c\ucd08 *\/\nTimeout.tv_sec  = 1;  \/* \ucd08 *\/\n\nres = select(maxfd, &amp;readfs, NULL, NULL, &amp;Timeout);\nif (res == 0) {\n    \/* \ud0c0\uc784\uc544\uc6c3 \ubc1c\uc0dd (\uc785\ub825 \uc5c6\uc774 1\ucd08 \uacbd\uacfc) *\/\n}<\/code><\/pre>\n<blockquote>\n<p><code>Timeout<\/code> \uac12\uc740 <code>select()<\/code> \ud638\ucd9c \uc2dc \ub0b4\ubd80\uc801\uc73c\ub85c \uac10\uc18c\ud558\ubbc0\ub85c, \ub8e8\ud504 \uc548\uc5d0\uc11c \ub2e4\uc2dc \ud638\ucd9c\ud560 \ub54c\ub9c8\ub2e4 <strong>\ubc18\ub4dc\uc2dc \uc7ac\uc124\uc815<\/strong>\ud574\uc57c \ud55c\ub2e4.<\/p>\n<\/blockquote>\n<hr \/>\n<h2>\uc815\ub9ac<\/h2>\n<table>\n<thead>\n<tr>\n<th>\uc785\ub825 \ubc29\uc2dd<\/th>\n<th>\ud2b9\uc9d5<\/th>\n<th>\uc801\ud569\ud55c \uc0c1\ud669<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Canonical<\/td>\n<td>\uc904 \ub2e8\uc704 \ucc98\ub9ac, \uae30\ubcf8 \ud130\ubbf8\ub110 \ub3d9\uc791<\/td>\n<td>\uc904 \ub2e8\uc704 \ud1b5\uc2e0 \uc0c1\ub300\ubc29\uacfc\uc758 \ud1b5\uc2e0<\/td>\n<\/tr>\n<tr>\n<td>Non-Canonical<\/td>\n<td>\uace0\uc815 \ud06c\uae30 \uc77d\uae30, \ud0c0\uc774\uba38 \uc9c0\uc6d0<\/td>\n<td>\uace0\uc815 \ud328\ud0b7 \ud06c\uae30 \ud1b5\uc2e0, \ub300\ub7c9 \uc804\uc1a1<\/td>\n<\/tr>\n<tr>\n<td>\ube44\ub3d9\uae30<\/td>\n<td>\uc2dc\uadf8\ub110 \uae30\ubc18, \uc989\uc2dc \ub9ac\ud134<\/td>\n<td>\ub300\uae30 \uc911 \ub2e4\ub978 \uc791\uc5c5\uc774 \ud544\uc694\ud55c \uacbd\uc6b0<\/td>\n<\/tr>\n<tr>\n<td>\uba40\ud2f0\ud50c\ub809\uc2f1<\/td>\n<td><code>select()<\/code> \uae30\ubc18 \ub2e4\uc911 \uc785\ub825 \uac10\uc2dc<\/td>\n<td>\uc5ec\ub7ec \uc7a5\uce58 \ub3d9\uc2dc \ucc98\ub9ac<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>\ub9ac\ub205\uc2a4 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0 \ud504\ub85c\uadf8\ub798\ubc0d \uac00\uc774\ub4dc \ucd9c\ucc98: The Linux Serial-Programming-HOWTO (C) 1997 by Peter Baumann \ub9ac\ub205\uc2a4 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0 \ud3ec\ud2b8 \uc138\ud305 \uc7a5\uce58 \ud30c\uc77c\uc778 \/dev\/ttyS*\ub294 \ub9ac\ub205\uc2a4\uc5d0\uc11c \ud130\ubbf8\ub110\uc744 \uc5f0\uacb0\ud558\uae30 \uc704\ud55c \ubaa9\uc801\uc73c\ub85c \uc0ac\uc6a9\ub41c\ub2e4. \uc774 \uc0ac\uc2e4\uc740 \uc2dc\ub9ac\uc5bc \ud1b5\uc2e0 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\ub294 \ub370 \ubc18\ub4dc\uc2dc \uae30\uc5b5\ud574\uc57c \ud560 \uc0ac\ud56d\uc774\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc2dc\ub9ac\uc5bc \ud3ec\ud2b8\ub3c4 \ubb38\uc790 \uc5d0\ucf54\ub97c \ud558\ub3c4\ub85d \uc124\uc815\ub418\uc5b4 \uc788\uc73c\uba70, \uc774 \uc124\uc815\uc740 \ubcf4\ud1b5 \ub370\uc774\ud130 \uc804\uc1a1 \uc2dc\uc5d0 \ubc14\uafd4\uc57c\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11770\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-11770","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11770"}],"version-history":[{"count":3,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11770\/revisions"}],"predecessor-version":[{"id":11773,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11770\/revisions\/11773"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}