{"id":4684,"date":"2021-07-14T13:01:16","date_gmt":"2021-07-14T04:01:16","guid":{"rendered":"https:\/\/now0930.pe.kr\/wordpress\/?p=4684"},"modified":"2021-07-14T13:03:10","modified_gmt":"2021-07-14T04:03:10","slug":"character-device%eb%a5%bc-tasklet%ec%9c%bc%eb%a1%9c-%ed%85%8c%ec%8a%a4%ed%8a%b8","status":"publish","type":"post","link":"https:\/\/now0930.pe.kr\/wordpress\/character-device%eb%a5%bc-tasklet%ec%9c%bc%eb%a1%9c-%ed%85%8c%ec%8a%a4%ed%8a%b8\/","title":{"rendered":"character device\ub97c tasklet\uc73c\ub85c \ud14c\uc2a4\ud2b8"},"content":{"rendered":"\n<p>tasklet\uc744 \ubc30\uc6b0\uace0 \uc2e4\uc2b5\ud558\ub2e4 \ubcf4\ub2c8, \uce90\ub9ad\ud130 \ub514\ubc14\uc774\uc2a4\ub97c \ud65c\uc6a9\ud55c \uc608\uc81c\ub97c \ucc3e\uc558\ub2e4. \ud558\ub2e4\ubcf4\ub2c8 \uac15\uc81c\ub85c character device\ub97c \ub4f1\ub85d, \uc5f4\uace0, \ub2eb\uace0, \uc77d\uace0, \uc4f0\ub294 \ubc29\ubc95\uc744 \ubc30\uc6e0\ub2e4.  \ub300\ucda9 \uc774\ud574\ud55c \ub2e4\uc74c \uc544\ub798 \ub3d9\uc791\uc744 \uad6c\uc131\ud588\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>read: \uc55e\ucabd\ubd80\ud130 \uc77d\uc74c.<\/li><li>write: \ub370\uc774\ud130\uac00 \uc788\ub2e4\uba74 \ub4a4\ub85c \ucc44\uc6cc \ub123\uc74c.<\/li><li>\uc778\ud130\ub7fd\ud2b8: gpio\ub97c \uc2dc\ubb3c\ub808\uc774\uc158\ud558\uc5ec \uc55e\uc5d0\uc11c \ud55c \uae00\uc790\uc529 \uc9c0\uc6c0.<\/li><li>\ubc84\ud37c \uc6a9\ub7c9\uc740 char 256\uac1c \uc0ac\uc6a9.<\/li><\/ul>\n\n\n\n<p>\uc804\uc5d0 \uc0ac\uc6a9\ud55c \ud30c\uc77c\uc744 \uc218\uc815\ud588\uace0, \ubaa8\ub4c8\uc744 \ub9cc\ub4e4\uae30 \uc704\ud55c makefile\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud588\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 &lt;linux\/module.h>\n#include &lt;linux\/kernel.h>\n#include &lt;linux\/init.h>\n#include &lt;linux\/irq.h>\n#include &lt;linux\/interrupt.h>\n#include &lt;linux\/gpio.h>     \/\/GPIO\n\n\n#include &lt;linux\/cdev.h>\n#include &lt;linux\/device.h>\n#include &lt;linux\/uaccess.h>\n#include &lt;linux\/fcntl.h>\n\n#define GPIO_10_OUT (10)\n#define DEVICE_DATA_MAX 256\n\nunsigned int GPIO_irqNumber;\n\nvoid my_tasklet_fn(unsigned long); \n\n\/*\\uc0ac\\uc6a9\\uc790 \\ub370\\uc774\\ud130 \\ubd80\\ubd84*\/\nstatic struct my_device_data{\n\tstruct cdev cdev;\n\tint index;\n\tchar my_string[DEVICE_DATA_MAX];\n}my_data_global;\n\nvoid my_tasklet_fn(unsigned long data) \n{\n\t\/*taskelet \\ubc1c\\uc0dd\\ud558\\uba74 \\uc55e\\uc5d0\\uc11c\\ubd80\\ud130 1\\uac1c \\ubb38\\uc790 \\uc0ad\\uc81c*\/\n\tstruct my_device_data *my_data;\n\tint i;\n\t\/*address\\ub85c data\\uac00 \\ub118\\uc5b4\\uc624\\uae30 \\ub54c\\ubb38\\uc5d0 \\ud3ec\\uc778\\ud130\\ub85c casting*\/\n\tmy_data = (struct my_device_data*)data;\n\t\/\/\\uc55e\\uc5d0\\uc11c\\ubd80\\ud130 \\ud55c \\ubb38\\uc790 \\uc0ad\\uc81c\n\tfor (i=0;i&lt;DEVICE_DATA_MAX;i++)\n\t{\n\t\tmy_data->my_string[i]=my_data->my_string[i+1];\n\n\t}\n\tmy_data->my_string[(DEVICE_DATA_MAX-1)]=(char)0;\n\tpr_info(\"taskelet: deleted 1st character.\\n\");\n\n}\n\n\/* Init the Tasklet by Static Method *\/\nDECLARE_TASKLET(my_tasklet,my_tasklet_fn, (unsigned long)&amp;my_data_global);\n\n\nstatic irqreturn_t gpio_irq_handler(int irq, void *dev_id)\n{\n\t\/*Scheduling Task to Tasklet*\/\n        tasklet_schedule(&amp;my_tasklet); \n\t\/\/pr_info(\"interrupt occured\\n\");\n\treturn IRQ_HANDLED;\n\n}\n\n\n\/\/device driver \\uc791\\uc131 \\ubd80\\ubd84.\n\/*************\\ub4dc\\ub77c\\uc774\\ubc84 \\ud568\\uc218 ******************\/\nstatic int mydriver_open(struct inode *inode, struct file *file);\nstatic int mydriver_release(struct inode *inode, struct file *file);\nstatic ssize_t mydriver_read(struct file *flip,\n\t\tchar *buf, size_t len, loff_t *off);\nstatic ssize_t mydriver_write(struct file *flip,\n\t\tconst char *buf, size_t len, loff_t *off);\n\/********************************************\/\n\n\n\n\/\/file operation structure\n\nstatic struct file_operations fops = \n{\n\t.owner = THIS_MODULE,\n\t.read = mydriver_read,\n\t.write = mydriver_write,\n\t.open = mydriver_open,\n\t.release = mydriver_release,\n};\n\nstatic int mydriver_open(struct inode *inode, struct file *file)\n{\n\tpr_info(\"Deviced file was opend.\\n\");\n\treturn 0;\n\n}\n\nstatic int mydriver_release(struct inode *inode, struct file *file)\n{\n\tpr_info(\"Deviced file was closed.\\n\");\n\treturn 0;\n}\n\n\nstatic int mydriver_read(struct file *file,\n\t\tchar *buf, size_t len, loff_t *off)\n{\n\tstruct my_device_data *my_data;\n\tsize_t datalen, read_len;\n\tmy_data = (struct my_device_data*)&amp;my_data_global;\n\tdatalen = strlen(my_data->my_string);\n\t\/\/\\ucd5c\\ub300\\uac12\\uc73c\\ub85c \\uac15\\uc81c \\uc124\\uc815\n\tif(len > datalen)\n\t{\n\t\tlen = datalen;\n\t}\n\tread_len = len - *off;\n\tif (read_len &lt;= 0)\n\t\treturn 0;\n\tpr_info(\"start %p, offset is %lld, read_len is %d\\n\", my_data->my_string, *off, read_len);\n\tif(copy_to_user(buf, my_data->my_string+*off, read_len))\n\t\treturn -EFAULT;\n\t\/\/read_len = datalen-*off;\n\t*off += read_len;\n\tpr_info(\"kernel has %d, read %d characters from kernel\\n\", datalen, read_len);\n\t\/\/zero\\ub97c \\ubc18\\ud658\\ud560 \\ub54c\\uae4c\\uc9c0 \\ubc18\\ubcf5.\n\treturn read_len;\n}\n\nstatic int mydriver_write(struct file *flip,\n\t\tconst char *buf, size_t len, loff_t *off)\n{\n\tstruct my_device_data *my_data;\n\tsize_t datalen, write_len, start_pos;\n\tmy_data = &amp;my_data_global;\n\tstart_pos = strlen(my_data->my_string);\n\tdatalen = strlen(my_data->my_string);\n\tif(len > datalen)\n\t{\n\t\tlen = DEVICE_DATA_MAX;\n\t}\n\n\twrite_len = len - *off;\n\n\tif(copy_from_user(my_data->my_string + start_pos + *off, buf, write_len))\n\t\treturn -EFAULT;\n\t*off += write_len;\n\treturn write_len;\n}\n\ndev_t dev = 0;\nstatic struct cdev my_cdev;\nstatic struct class *dev_class;\n\nstatic int __init init_hw(void)\n{\n\t\/\/\\ub514\\ubc14\\uc774\\uc2a4 \\ub4f1\\ub85d\n\tif(( alloc_chrdev_region(&amp;dev, 0, 1, \"test_device\") &lt; 0))\n\t{\n\t\tpr_err(\"[!]character device was not allocated\\n\");\n\t\tgoto r_unreg;\n\n\t}\n\tpr_info(\"[=]%d-%d, was allocated\\n\", MAJOR(dev), MINOR(dev));\n\n\n\t\/\/\\ucd08\\uae30\\ud654\n\tcdev_init(&amp;my_cdev, &amp;fops);\n\tpr_info(\"[=]driver was initialized\\n\");\n\n\n\t\/\/\\uc2dc\\uc2a4\\ud15c\\uc5d0 \\ucd94\\uac00\n\tif((cdev_add(&amp;my_cdev, dev, 1)) &lt; 0)\n\t{\n\t\tpr_err(\"[!]cannot add device to kernel\\n\");\n\t\tgoto r_del;\n\n\t}\n\n\n\t\/\/class \\ub9cc\\ub4e6.\n\tif((dev_class=class_create(THIS_MODULE, \"my_class\")) == NULL)\n\t{\n\t\tpr_err(\"[!]cannot add class\\n\");\n\t\tgoto r_class;\n\t}\n\n\n\tif((device_create(dev_class, NULL, dev, NULL, \"my_device\")) == NULL)\n\t{\n\n\t\tpr_err(\"[!]cannot create device\\n\");\n\t\tgoto r_device;\n\t}\n\n\t\/\/gpio 10\\ubc88\\uc744 \\uc0ac\\uc6a9.\n\t\/\/export\\ud558\\uc5ec \\uac04\\ub2e8\\ud788 \\uc0ac\\uc6a9.\n\t\/\/\\uc785\\ub825\\uc740 \\uac12\\uc744 \\uc368 \\ub123\\uc744 \\uc218 \\uc5c6\\uc74c. \\ucd9c\\ub825\\uc73c\\ub85c \\uc124\\uc815.\n\tGPIO_irqNumber = gpio_to_irq(GPIO_10_OUT);\n\tpr_info(\"[=]irq %d was assinged\\n\",GPIO_irqNumber);\n\n\t\/\/interrupt \\ub4f1\\ub85d \\ud544\\uc694\n\tif (request_irq(GPIO_irqNumber,\n\t\t\t\t(void*)gpio_irq_handler,\n\t\t\t\tIRQF_TRIGGER_RISING,\n\t\t\t\t\"my_device\",\n\t\t\t\tNULL))\n\t{\n\t\tpr_err(\"[!]my_device: cannot register IRQ\\n\");\n\t\tgoto r_gpio;\n\t}\n\tpr_info(\"[=]module was installed\\n\");\n\treturn 0;\nr_gpio:\n\tgpio_free(GPIO_10_OUT);\nr_device:\n\tdevice_destroy(dev_class,dev);\n\nr_class:\n\tclass_destroy(dev_class);\nr_del:\n\tcdev_del(&amp;my_cdev);\nr_unreg:\n\tunregister_chrdev_region(dev,1);\n\n\treturn -1;\n}\n\nstatic void __exit exit_hw(void) {\n\tfree_irq(GPIO_irqNumber, NULL);\n\tgpio_free(GPIO_10_OUT);\n\tdevice_destroy(dev_class,dev);\n\t\/\/class_unregister(dev_class);\n\tclass_destroy(dev_class);\n\tcdev_del(&amp;my_cdev);\n\tunregister_chrdev_region(dev,1);\n\tprintk(KERN_INFO \"module was removed\\n\");\n}\n\n\nmodule_init(init_hw);\nmodule_exit(exit_hw);\nMODULE_LICENSE(\"GPL\");\nMODULE_AUTHOR(\"Eunseong Park (esp-ark.com)\");\nMODULE_DESCRIPTION(\"Hello, world!\");\n<\/pre>\n\n\n\n<p>make \ud6c4 \ubaa8\ub4c8\uc744 \ub85c\ub529\ud55c\ub2e4. \uce90\ub9ad\ud130 \ub514\ubc14\uc774\uc2a4\uac00 236, 0\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\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:~\/RaspberryDebug\/my_driver_tasklet $ sudo insmod my_driver.ko \npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ lsmod | grep my_driver\nmy_driver              16384  0\npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ dmesg | tail -4\n[42918.717112] [=]236-0, was allocated\n[42918.717123] [=]driver was initialized\n[42918.717332] [=]irq 54 was assinged\n[42918.717363] [=]module was installed\npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ ls \/dev\/my_device -l\ncrw------- 1 root root 236, 0  7\\uc6d4 14 12:45 \/dev\/my_device<\/pre>\n\n\n\n<p>\uc4f0\uae30\ub97c \uc704\ud574 \uad8c\ud55c\uc744 \ubd80\uc5ec\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:~\/RaspberryDebug\/my_driver_tasklet $ sudo chmod 666 \/dev\/my_device ;ls -l \/dev\/my_device \ncrw-rw-rw- 1 root root 236, 0  7\\uc6d4 14 12:45 \/dev\/my_device<\/pre>\n\n\n\n<p>\ub85c\ub529 \ud6c4 \uc77d\uc5b4\ubcf4\uba74 \uc544\ubb34\ub7f0 \ub370\uc774\ud130\ub97c \uc77d\uc744 \uc218 \uc5c6\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:~\/RaspberryDebug\/my_driver_tasklet $ head -c10 \/dev\/my_device\npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ dmesg | tail -2\n[43123.405028] Deviced file was opend.\n[43123.405091] Deviced file was closed.<\/pre>\n\n\n\n<p>\uc6d0\ud558\ub294 \ub370\uc774\ud130\ub97c \ub514\ubc14\uc774\uc2a4\uc5d0 \uae30\ub85d\ud55c\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:~\/RaspberryDebug\/my_driver_tasklet $ echo \"I need more space to delete characters\" > \/dev\/my_device \npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ echo \"I need more space to delete characters\" > \/dev\/my_device<\/pre>\n\n\n\n<p>\ub0b4\uc6a9\uc744 \ud655\uc778\ud55c\ub2e4. \ucd5c\ub300 \uae38\uc774\ub97c \ub118\uae30\uba74 \uc798\ubabb \uc77d\ub294\ub370 \uc5b4\ub5bb\uac8c \ud574\uacb0\ud560 \uc9c0 \ubaa8\ub974\uaca0\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:~\/RaspberryDebug\/my_driver_tasklet $ head -c100 \/dev\/my_device \nI need more space to delete characters\nI need more space to delete characters\nhead: '\/dev\/my_device\ub97c \uc77d\ub294 \ub3c4\uc911 \uc624\ub958 \ubc1c\uc0dd: \uc8fc\uc18c\uac00 \uc798\ubabb\ub428\npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ dmesg | tail -10\n[43264.763161] Deviced file was closed.\n[43309.683908] Deviced file was opend.\n[43309.683961] start 18f123ee, offset is 0, read_len is 10\n[43309.683972] kernel has 78, read 10 characters from kernel\n[43309.684006] Deviced file was closed.\n[43316.934115] Deviced file was opend.\n[43316.934165] start 18f123ee, offset is 0, read_len is 78\n[43316.934183] kernel has 78, read 78 characters from kernel\n[43316.934260] start 18f123ee, offset is 78, read_len is -56\n[43316.934813] Deviced file was closed.<\/pre>\n\n\n\n<p>\uc778\ud130\ub7fd\ud2b8\ub97c \uc124\uc815 \ud55c \ub2e4\uc74c \ubc1c\uc0dd\uc2dc\ud0a8\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:~\/RaspberryDebug\/my_driver_tasklet $ sudo .\/config_gpio.sh \n1\npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ .\/make_gpio.sh \npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ cat config_gpio.sh \n#!\/bin\/bash\necho \"10\" > \/sys\/class\/gpio\/export\necho \"out\" > \/sys\/class\/gpio\/gpio10\/direction \ngpio read 10\npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ cat make_gpio.sh \n#!\/bin\/bash\n#echo \"10\" > \/sys\/class\/gpio\/export\n#sleep(1)\n#echo \"out\" > \/sys\/class\/gpio\/gpio10\/direction \n#sleep(1)\n#gpio read 10\n#sleep(1)\necho 0 > \/sys\/class\/gpio\/gpio10\/value ; echo 1 > \/sys\/class\/gpio\/gpio10\/value;\nsleep 1\necho 0 > \/sys\/class\/gpio\/gpio10\/value ; echo 1 > \/sys\/class\/gpio\/gpio10\/value;\nsleep 1\necho 0 > \/sys\/class\/gpio\/gpio10\/value ; echo 1 > \/sys\/class\/gpio\/gpio10\/value;\npi@raspberrypi:~\/RaspberryDebug\/my_driver_tasklet $ dmesg | tail -10\n[43309.683972] kernel has 78, read 10 characters from kernel\n[43309.684006] Deviced file was closed.\n[43316.934115] Deviced file was opend.\n[43316.934165] start 18f123ee, offset is 0, read_len is 78\n[43316.934183] kernel has 78, read 78 characters from kernel\n[43316.934260] start 18f123ee, offset is 78, read_len is -56\n[43316.934813] Deviced file was closed.\n[43694.677107] taskelet: deleted 1st character.\n[43695.686488] taskelet: deleted 1st character.\n[43696.693794] taskelet: deleted 1st character.<\/pre>\n\n\n\n<p>\ub2e4\uc2dc \uc77d\uc5b4\ubcf8\ub2e4. \uc55e \uce90\ub9ad\ud130 3\uac1c\uac00 \uc9c0\uc6cc\uc84c\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:~\/RaspberryDebug\/my_driver_tasklet $ head -c100 \/dev\/my_device \need more space to delete characters\nI need more space to delete characters\nhead: '\/dev\/my_device\ub97c \uc77d\ub294 \ub3c4\uc911 \uc624\ub958 \ubc1c\uc0dd: \uc8fc\uc18c\uac00 \uc798\ubabb\ub428<\/pre>\n\n\n\n<p><a href=\"https:\/\/olegkutkov.me\/2018\/03\/14\/simple-linux-character-device-driver\/\">https:\/\/olegkutkov.me\/2018\/03\/14\/simple-linux-character-device-driver\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/linux-kernel-labs.github.io\/refs\/heads\/master\/labs\/device_drivers.html\">https:\/\/linux-kernel-labs.github.io\/refs\/heads\/master\/labs\/device_drivers.html<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/1330284\/how-might-i-learn-to-write-char-device-drivers-for-linux\">https:\/\/stackoverflow.com\/questions\/1330284\/how-might-i-learn-to-write-char-device-drivers-for-linux<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.oreilly.com\/library\/view\/linux-device-drivers\/0596000081\/ch03s04.html\">https:\/\/www.oreilly.com\/library\/view\/linux-device-drivers\/0596000081\/ch03s04.html<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/pr0gr4m.tistory.com\/entry\/Linux-Kernel-5-Character-Device-Driver\">https:\/\/pr0gr4m.tistory.com\/entry\/Linux-Kernel-5-Character-Device-Driver<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/derekmolloy.ie\/writing-a-linux-kernel-module-part-2-a-character-device\/\">http:\/\/derekmolloy.ie\/writing-a-linux-kernel-module-part-2-a-character-device\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/12124628\/endlessly-looping-when-reading-from-character-device\">https:\/\/stackoverflow.com\/questions\/12124628\/endlessly-looping-when-reading-from-character-device<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>tasklet\uc744 \ubc30\uc6b0\uace0 \uc2e4\uc2b5\ud558\ub2e4 \ubcf4\ub2c8, \uce90\ub9ad\ud130 \ub514\ubc14\uc774\uc2a4\ub97c \ud65c\uc6a9\ud55c \uc608\uc81c\ub97c \ucc3e\uc558\ub2e4. \ud558\ub2e4\ubcf4\ub2c8 \uac15\uc81c\ub85c character device\ub97c \ub4f1\ub85d, \uc5f4\uace0, \ub2eb\uace0, \uc77d\uace0, \uc4f0\ub294 \ubc29\ubc95\uc744 \ubc30\uc6e0\ub2e4. [&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":[53,798,933,912],"class_list":["post-4684","post","type-post","status-publish","format-standard","hentry","category-12","tag-linux","tag-raspberry","tag-tasklet","tag-912"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4684","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=4684"}],"version-history":[{"count":5,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4684\/revisions"}],"predecessor-version":[{"id":4694,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4684\/revisions\/4694"}],"wp:attachment":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=4684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=4684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=4684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}