fcntlÀ» ÀÌ¿ëÇÑ ÆÄÀÏÁ¦¾î
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

fcntl À» ÀÌ¿ëÇÑ ÆÄÀÏÁ¦¾î

1절. ¼Ò°³

À¯´Ð½ºÀÇ ¸ðµç°ÍÀº ÆÄÀÏ·Î ÀÌ·ç¾îÁ® ÀÖ´Ù´Â »ç½ÇÀº ¾Æ¸¶µµ À߾˰í ÀÖÀ» °ÍÀÌ´Ù. ±×·¯¹Ç·Î À¯´ÉÇÑ? À¯´Ð½º ÇÁ·Î±×·¡¸Ó·Î ¼ºÀåÇϱâ À§Çؼ­´Â ÆÄÀϰü·ÃµÈ ¿©·¯°¡Áö ÀÛ¾÷µéÀ» ´É¼÷ÇÏ°Ô Ã³¸®ÇÒ¼ö ÀÖ¾î¾ßÇÑ´Ù. ½ÇÁ¦·Î À¯´Ð½º ÇÁ·Î±×·¥À» ÇÏ°Ô µÇ¸é °¡Àå ¸¹ÀÌ ÇÏ´Â ÀÛ¾÷ÀÌ ÆÄÀϰú ¿¬°üµÈ ÀÛ¾÷ÀÌ´Ù.

ÀÏ¹Ý ÆÄÀÏÀº ¹°·ÐÀ̰í, ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö½Ã ¼ÒÄÏÀ» ´Ù·ê¶§, IPC, µð¹ÙÀ̽ºµîÀ» ´Ù·ç´Â ¸ðµç °ÍÀÌ °á±¹Àº ÆÄÀÏÀ» ´Ù·ç´Â °ÍµéÀÌ´Ù.

fcntl Àº ÀÌ·¯ÇÑ ÆÄÀϵéÀÇ Æ¯¼º Á¦¾î¸¦ À§ÇØ Á¦°øÇÏ´Â ÇÔ¼öÀÌ´Ù.


2절. fcntl À» ÀÌ¿ëÇÑ ÆÄÀÏÁ¦¾î

fcntl ½Ã½ºÅÛÈ£ÃâÀº ÀÌ¹Ì ¿­·ÁÀÖ´Â ÆÄÀÏÀÇ Æ¯¼º Á¦¾î¸¦ À§Çؼ­ »ç¿ëµÈ´Ù.

#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
		

ù¹øÂ° ÀÎÀÚ·Î ÁÖ¾îÁö´Â fd ´Â open(2), socket(2) µîÀÇ ½Ã½ºÅÛ È£ÃâÀ» ÅëÇØ¼­ ¸¸µé¾îÁø ÆÄÀÏ ÁöÁ¤ÀÚÀÌ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ cmd °¡ fd ¿¡ ´ëÇÑ Æ¯¼ºÀ» Á¦¾îÇϱâÀ§ÇÑ °ªÀÌ´Ù.


2.1절. fcntl ·Î ÇÒ¼ö ÀÖ´Â Àϵé

fcntl ·Î ÇÒ¼ö ÀÖ´Â ÀϵéÀº °á±¹ cmd ¿¡ ÀÇÇØ¼­ °áÁ¤µÈ´Ù°í º¼¼ö ÀÖ´Ù. ´ë·«ÀûÀ¸·Î ÇÒ¼ö ÀÖ´Â ÀϵéÀº ´ÙÀ½°ú °°´Ù. ÇÒ¼ö ÀÖ´Â ÀÏÀº cmd ¿¡ ÀÇÇØ¼­ °áÁ¤µÊÀ¸·Î cmd º°·Î ¼³¸íÀ» Çß´Ù.

F_DUPFD

À̸§¿¡¼­ ÁÖ´Â ¾î°¨Ã³·³ ¿­·ÁÁø ÆÄÀÏÁöÁ¤ÀÚ¸¦ º¹»çÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ¾ð¶æº¸¸é dup2(2) ÇÔ¼ö¿Í ¸Å¿ì ºñ½ÁÇѵ¥, dup2 ´Â º¹»çµÉ ÆÄÀÏÁöÁ¤ÀÚ¸¦ »ç¿ëÀÚ°¡ Áö½ÃÇÏ´Â ¹Ý¸é, F_DUPFD ¸¦ »ç¿ëÇÒ°æ¿ì arg ¿Í °°Àº Å©±âÀÇ ÆÄÀÏÁöÁ¤ÀÚ¸¦ µÇµ¹·ÁÁְųª, ÀÌ¹Ì »ç¿ëµÇ¾îÁö°í ÀÖ´Ù¸é, arg º¸´Ù Å« ÇÒ´ç°¡´ÉÇÑ ÆÄÀÏÁöÁ¤¹øÈ£Áß °¡Àå ÀÛÀº ¹øÈ£¸¦ µÇµ¹·ÁÁØ´Ù.

ÀÌ º¹»çµÈ ÆÄÀÏÁöÁ¤¹øÈ£´Â Àá±Ý, ÆÄÀÏÀ§Ä¡ Æ÷ÀÎÅÍ, Ç÷¹±× µîÀ» °øÀ¯ÇÑ´Ù. Áï ÆÄÀÏÁöÁ¤ÀÚµéÁß Çϳª¿¡¼­ ÆÄÀÏÀÇ À§Ä¡°¡ º¯°æµÈ´Ù¸é(lseekµîÀ» ÀÌ¿ë), ´Ù¸¥ ÆÄÀÏÁöÁ¤ÀÚµµ º¯°æµÈ´Ù.

±×·¸Áö¸¸ close-on-exec ´Â °øÀ¯ÇÏÁö ¾Ê´Â´Ù. close-on-exec ´Â ´ÙÀ½Àå¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.

F_GETFD

¸®ÅϰªÀ¸·Î fd ¿¡ ´ëÇÑ flag °ªÀ» ³Ñ°ÜÁØ´Ù. ÇöÀç´Â FD_CLOEXEC Á¤º¸¸¸ ³Ñ°ÜÁØ´Ù. FD_CLOEXEC ´Â close-on-exec Á¤Ã¥¿¡ °üÇÑ ³»¿ëÀ¸·Î ´ÙÀ½Àå¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.

F_SETFD

FD_CLOEXEC(close-on-exec) ÀÇ °ªÀ» ÁöÁ¤µÈ ºñÆ®°ªÀ¸·Î ¼³Á¤ÇÑ´Ù.

F_GETFL

ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇÑ Ç÷¡±×°ª - open(2) È£Ãâ½Ã ÁöÁ¤ÇÑ Ç÷¡±×¸¦ µÇµ¹·ÁÁØ´Ù.

F_SETFL

arg ¿¡ ÁöÁ¤µÈ °ªÀ¸·Î ÆÄÀÏÁöÁ¤ÀÚ fd ÀÇ Ç÷¡±×¸¦ Àç ¼³Á¤ÇÑ´Ù. ÇöÀç´Â ´ÜÁö O_APPEND, O_NONBLOCK, O_ASYNC ¸¸À» ¼³Á¤ÇÒ¼ö ÀÖ´Ù. ´Ù¸¥ Ç÷¡±×µé (O_WRONLY ¿Í °°Àº) Àº ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù.

F_GETOWN

À̰ÍÀº ºñµ¿±â ÀÔÃâ·Â°ú °ü·ÃµÇ¾î¼­ »ç¿ëµÇ¸ç, SIGIO¿Í SIGURG ½ÅÈ£¸¦ ¹Þ´Â ÇÁ·Î¼¼½º ¾ÆÀ̵𸦠¾ò±â À§Çؼ­ »ç¿ëµÈ´Ù.

F_SETOWN

ºñµ¿±â ÀÔÃâ·Â°ú °ü·ÃµÇ¾î¼­ »ç¿ëµÇ¸ç, SIGIO, SIGURG ½Ã±×³ÎÀ» ¼ö½ÅÇÏ´Â ÇÁ·Î¼¼½º ¾ÆÀ̵ð(ȤÀº ±×·ì)À» ¼³Á¤Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù.

À̿ܿ¡µµ F_SETLK, F_SETLKW, F_SETLK ¿Í °°Àº ·¹ÄÚµå Àá±Ý¿¡ ´ëÇÑ ¼³Á¤µµ °¡´ÉÇÏ´Ù. ÀÌ ³»¿ëµéÀº fcntl ·¹ÄÚµåÀá±Ý¿¡¼­ ´Ù·ç°í ÀÖÀ½À¸·Î ¿©±â¿¡¼­ ¼³¸íÇÏÁø ¾Ê°Ú´Ù. (¶ÇÇÑ À̹®¼­ÀÇ ³»¿ëÀº ÆÄÀÏ´ÜÀ§ÀÇ Æ¯¼º Á¶ÀÛÀ̹ǷΠ·¹ÄÚµå´ÜÀ§ÀÇ Æ¯¼ºÁ¶ÀÛÀº ÀÌ ¹®¼­ÀÇ ³»¿ë°ú ´Ù¸¥ºÐ¾ßÀÌ´Ù.)


2.2절. close-on-exec ¿¡ ´ëÇØ¼­

fcntlÀÇ Æ¯¼ºÁ¦¾î¸¦ ´Ù·ç±â Àü¿¡ close-on-exec¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

º¸Åë ÇÁ·Î¼¼½º¿¡¼­ exec(3) ¸¦ ½ÃÄѼ­ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÇÇà½Ã۸é ÀÌ »õ·Î¿î ÇÁ·Î¼¼½º´Â ±âÁ¸ÀÇ ÇÁ·Î¼¼½ºÀÇ À̹ÌÁö¸¦ µ¤¾î¾²°Ô µÈ´Ù. ±×·¯¸é¼­ Ưº°ÇÑ ¼³Á¤ÀÌ ¾øÀ»°æ¿ì ¿­¸°ÆÄÀÏÁöÁ¤ÀÚ¸¦ ±×´ë·Î ³Ñ°ÜÁÖ°Ô µÈ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ open-on-exec.c ·Î ÀúÀåÇϵµ·Ï ÇÏÀÚ.

¿¹Á¦ : open-on-exec.c

#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int fd;
    int val;
    fd = open("exec_copy.txt", O_CREAT);

    execl("/home/my_cvs/test/c_source/loop", "./loop", 0);
}
			
execl ·Î ½ÇÇà½ÃŰ´Â loop ÇÁ·Î±×·¥Àº ±×³É ¹«ÇÑ·çÇÁ µµ´Â ÇÁ·Î±×·¥ ÀÌ´Ï °¢ÀÚ ¸¸µé±â ¹Ù¶õ´Ù.

À§ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲÈÄ ps ¸¦ È®ÀÎÇϰí /proc/pid/fd ·Î À̵¿Çؼ­ ls ¸¦ ÇØº¸¸é

[root@coco fd]# ls -al
ÇÕ°è 0
dr-x------    2 root     root            0 10¿ù 25 13:59 .
dr-xr-xr-x    3 root     root            0 10¿ù 25 13:59 ..
lrwx------    1 root     root           64 10¿ù 25 13:59 0 -> /dev/ttyp0
lrwx------    1 root     root           64 10¿ù 25 13:59 1 -> /dev/ttyp0
lrwx------    1 root     root           64 10¿ù 25 13:59 2 -> /dev/ttyp0
lr-x------    1 root     root           64 10¿ù 25 13:59 3 -> /home/mycvs/test/exec_copy.txt
			
exec Çϸ鼭 ¿­¸°ÆÄÀÏÁöÁ¤ÀÚ°¡ »ó¼ÓµÇ¾úÀ½À» ¾Ë¼ö ÀÖ´Ù.

±×·¯³ª ¶§¶§·Î exec ¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·Î¼¼½º¸¦ ¸¸µé±âÀü¿¡ ±âÁ¸¿¡ ¿­·È´ø ÆÄÀÏÁöÁ¤ÀÚµéÀ» ±ú²ýÇÏ°Ô Á¤¸®ÇÏ°í ½ÍÀ»¶§°¡ ÀÖÀ»°ÍÀÌ´Ù. ÀÌ·¯ÇÑ °æ¿ì¸¦ close-on-exec ½ÃŲ´Ù¶ó°í ¸»Çϸç, fcntl À» ÀÌ¿ëÇØ¼­ ¿­¸° ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇØ¼­ close-on-exec ÀÛµ¿À» Çϵµ·Ï ÇÒ¼ö ÀÖ´Ù. À§ÀÇ open-on-exec.c ¸¦ close-on-exec ¹öÁ¯À¸·Î ¹Ù²Ù´Â ¹æ¹ýÀº 2.3.2절¿¡¼­ ¼³¸íÇϵµ·Ï ÇϰڴÙ.


2.3절. ÆÄÀÏÆ¯¼ºÁ¶ÀÛ Çϱâ

2.3.1절. F_DUPFD

À§¿¡¼­ ¼³¸íÀ» ÀÌ¹Ì ÇßÀ½À¸·Î °£´ÜÇÑ ¿¹Á¦·Î ÀÌÇØ¸¦ µ½´Â ¼öÁØ¿¡¼­ ³¡³»µµ·Ï ÇϰڴÙ.

¿¹Á¦ : f_dupfd.c

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

int main()
{
    int testfd;
    int fd;

    fd  = open("test.txt", O_CREAT);

    testfd = fcntl(fd, F_DUPFD, 10);
    printf("testfd :%d\n", testfd);
    testfd = fcntl(fd, F_DUPFD, 10);
    printf("testfd :%d\n", testfd);

    getchar();
}
				
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѺ¸¸é testfd ·Î °¢°¢ 4, 5 °¡ ¾Æ´Ñ (0, 1, 2 ´Â Ç¥ÁØ ÀÔ·Â/Ãâ·Â/¿¡·¯, 3 Àº test.txt) 10, 11 ·Î ÆÄÀÏÁöÁ¤¹øÈ£°¡ ÁöÁ¤µÊÀ» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù.


2.3.2절. F_SETFD/F_GETFD

close-on-exec °ªÀ» Á¶Á¤Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù. F_GETFD ¸¦ ÀÌ¿ëÇØ¼­ FD_CLOEXEC °ªÀ» °¡Á®¿À°í F_SETFD ¸¦ ÀÌ¿ëÇØ¼­ ÀÌ °ªÀ» º¯°æÇÑ´Ù. ±âº»ÀûÀ¸·Î´Â exec ÇÒ¶§ close µÇÁö ¾Ê´Â´Ù. ±×·³ f_dupfd.c ¸¦ close-on-exec Çϵµ·Ï ¾à°£ º¯°æ ÇØº¸µµ·Ï ÇÏÀÚ.

¿¹Á¦ : close-on-exec

#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int fd;
    int val;
    fd = open("exec_copy.txt", O_CREAT);

    // FD_CLOEXEC °ªÀ» fcntl À» ÀÌ¿ëÇØ¼­ 
    // °¡Á®¿Â ´ÙÀ½ ¼¼ÆÃµÇ¾î ÀÖ´ÂÁö °Ë»çÇÑ´Ù.  
    val = fcntl(fd, F_GETFD, 0);
    if (val & FD_CLOEXEC)
        printf("close-on-exec bit on\n");
    else
        printf("close-on-exec bit off\n");


    // FD_CLOEXEC ¸¦ ¼¼ÆÃÇÑ´Ù. 
    val |= FD_CLOEXEC;
    if (val & FD_CLOEXEC)
        printf("close-on-exec bit on\n");
    else
        printf("close-on-exec bit off\n");
    fcntl(fd, F_SETFD, val);

    // loop ÇÁ·Î±×·¥À» exec ½ÃŲ´Ù.  
    execl("/home/my_cvs/test/c_source/loop", "./loop", 0);
}
				
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ¾Æ·¡¿Í °°Àº ½ÇÇà °á°ú¸¦ º¸¿©ÁÙ°ÍÀÌ´Ù.
[root@localhost c_source]# ./close-on-exec 
close-on-exec bit off
close-on-exec bit on
				
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѵР»óÅ¿¡¼­ °ú¿¬ fd °¡ close-on-exec µÇ¾ú´ÂÁö /proc/pid/fd ¸¦ È®ÀÎÇØº¸¸é ±âÁ¸¿¡ ¿­·ÁÀÖ´ø fd °¡ »ó¼ÓµÇ¾îÀÖÁö ¾ÊÀ½À» È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.


2.3.3절. F_GETFL/F_SETFL

F_GETFL À» open(2)µî¿¡ ÀÇÇØ¼­ ¿­·ÁÁø ÆÄÀÏÁöÁ¤ÀÚ ¿¡ ´ëÇÑ Ç÷¹±× °ªÀ» Àоî¿Â´Ù. ±×¸®°í F_SETFL ¿¡ ÀÇÇØ¼­ ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇÑ °ª(Ư¼º)À» ¼¼ÆÃÇÑ´Ù.

F_SETFL À» ÀÌ¿ëÇØ¼­ º¯°æÇÒ¼ö ÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚÀÇ Æ¯¼ºÀº O_APPEND, O_NONBLOCK, O_ASYNC µîÀÌ´Ù. O_RDONLY, O_WRONLY, O_RDWR µîÀÇ Á¤º¸´Â Àоî¿Ã¼ö´Â ÀÖÁö¸¸ º¯°æÇÒ¼ö´Â ¾ø´Ù.

¿ì¼± Àбâ±ÇÇÑ Á¤º¸¸¦ Àоî¿À´Â °ÍÀº O_ACCMODE ¿Í ºñÆ®¿¬»êÀ» ÇÔÀ¸·Î½á °¡Á®¿Ã¼ö ÀÖ´Ù. ±×¹Û¿¡ Á¤º¸´Â °¢°¢ÀÇ Ç÷¹±×(O_APPEND, O_NONBLOCK, O_ASYNC) µî°ú ºñÆ®¿¬»êÀ» ÇÔÀ¸·Î½á ¾ò¾î¿Ã¼ö ÀÖ´Ù.

¿¹Á¦ : fgetfl_test.c

#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int mode, fd, value;

    fd = open("test.sh", O_RDONLY|O_CREAT);
    if (fd < 0)
    {
        perror("open error : ");
        exit(0);
    }

    value = fcntl(fd, F_GETFL, 0);

    mode = value & O_ACCMODE;
    if (mode == O_RDONLY)
        printf("O_RDONLY setting\n");
    else if (mode == O_WRONLY)
        printf("O_WRONLY setting\n");
    else if (mode == O_RDWR)
        printf("O_RDWR setting\n");

    if (value & O_NONBLOCK)
        printf("O_NONBLOCK setting\n");
    else
        printf("BLOCKING mode setting\n");
    if (value & O_ASYNC)
        printf("O_ASYNC setting\n");

}
				
ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ¸é ´ÙÀ½°ú °°Àº °á°ú¸¦ º¸¿©ÁÙ°ÍÀÌ´Ù.
[root@localhost c_source]# ./fgetfl_test
O_RDONLY setting
BLOCKING mode setting
				
ÃÖÃÊ open ½ÃÀÇ ÆÄÀÏ Ç÷¹±× °ªÀ» Àоî¿À°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.

Ư¼ºÀ» º¯°æÇÒ¼ö ÀÖ´Â 3°³ÀÇ °æ¿ì ´Ü¼øÈ÷ ºñÆ®¿¬»êÀ» ÇØ¼­ ÇØ´ç flag ¸¦ Ų´ÙÀ½¿¡ ±×°ªÀ» fcntl À» ÀÌ¿ëÇØ¼­ ÆÄÀÏÁöÁ¤ÀÚ¿¡ ¼¼ÆÃÇØÁÖ¸é µÈ´Ù. ´ÙÀ½ ¿¹Á¦´Â Ç¥ÁØÀÔ·Â(0) À» NONBLOCK ¸ðµå·Î º¯°æ ½ÃŲ ¿¹ÀÌ´Ù.

fsetfl_test.c

#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

#define STDIN 0 
int main()
{
    int mode, fd, value;
    char buf[255];

    memset(buf, 0x00, 255);

    // óÀ½ ÀÔ·ÂÀº ºÀ¼â¸ðµå·Î
    read (STDIN, buf, 255);
    printf("-> %s\n", buf);
    memset(buf, 0x00, 255);

    // NONBLOCKING ¸ðµå·Î º¯°æÇÑ´Ù. 
    value = fcntl(STDIN, F_GETFL, 0);
    value |= O_NONBLOCK;
    fcntl(STDIN, F_SETFL, value);
    printf("NON BLOCKING MODE ·Î º¯°æ \n");

    // 2ÃÊÈÄ ºñºÀ¼â ¸ðµå·Î µé¾î°£´Ù.
    sleep(2);

    // ¹Ù»Û´ë±â(busy wait) ½ÃÀÛ
    while(1)
    {
        read (STDIN, buf, 255);
        printf("-> %s\n", buf);
    }
}
				
±âº»ÀûÀ¸·Î Ç¥ÁØÀÔ·Â(0) Àº ºÀ¼â¸ðµå·Î ½ÃÀ۵ȴÙ. À̰ÍÀ» fcntl À» ÀÌ¿ëÇØ¼­ ºñºÀ¼â ¸ðµå·Î ¸¸µé°í Å×½ºÆ®ÇѰÍÀÌ´Ù. À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇàÇϸé óÀ½ ÀÔ·ÂÀº ºÀ¼â¸ðµå·Î »ç¿ëÀÚ ÀÔ·ÂÀÌ ÀÖÀ»¶§±îÁö ±â´Ù¸®°í, ±× ÈÄ¿¡´Â ºñºÀ¼â ¸ðµå·Î ¹Ù»Û »óÅ¿¡¼­ »ç¿ëÀÚ ÀÔ·ÂÀ» ó¸®Çϴ°ÍÀ» º¼¼ö ÀÖÀ»°ÍÀÌ´Ù.

O_ASYNC ¿Í O_APPEND ¿ª½Ã µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î 󸮰¡´ÉÇÏ´Ù.

O_APPEND ´Â ´ëÃæ ¾î¶°ÇÑ Æ¯¼ºº¯°æÀ» À§Çؼ­ »ç¿ëÇÏ´ÂÁö ¾Ë°ÍÀÌ´Ù. O_ASYNC ¿¡ ´ëÇØ¼­´Â º°·Î Àͼ÷ÇÏÁö ¾ÊÀ»¼öµµ Àִµ¥, À¯´Ð½º I/O ¸ðµ¨Áß ÈçÈ÷ ¸»ÇÏ´Â "ºñµ¿±â ÀÔÃâ·Â" ¸ðµ¨À» ±¸ÇöÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ºñµ¿±â´Â ¾ðÁ¦ ÀϾÁö ¾Ë¼ö ¾ø´Â »ç°ÇÀ» ¸»Çϸç, À¯´Ð½º¿¡¼­´Â ÀÌ·¯ÇÑ ºñµ¿±â »ç°ÇÀ» ¾Ë·ÁÁÖ±â À§Çؼ­ ½Ã±×³Î(signal)À» »ç¿ëÇÑ´Ù. À¯´Ð½ºÀÇ I/O ¸ðµ¨ÀÇ Á¾·ù´Â ¸®´ª½º I/O ¸ðµ¨ À» Âü°íÇϱ⠹ٶõ´Ù.

ÀÌ ¹®¼­¿¡¼­´Â ºñµ¿±â ÀÔ·ÂÃâ¹æ¹ý ÀÚü¿¡ ´ëÇÑ ³»¿ëÀº ´Ù·çÁö ¾ÊÀ»°ÍÀÌ´Ù. À̰ÍÀº ¸®´ª½º I/O ¸ðµ¨ÀÇ ¶Ç´Ù¸¥ ±¸ÇöÀÓÀ¸·Î ¸®´ª½º I/O ¸ðµ¨ °ü·Ã ¹®¼­¸¦ ´Ù·ç¸é¼­ ¾ð±ÞÇÒ°ÍÀÌ´Ù. (ÇöÀç´Â Blocking I/O, Non-Blocking I/O, I/O Multiplexing ±îÁö¸¦ ´Ù·é ¹®¼­µéÀÌ Á¦°øµÇ°í ÀÖ´Ù) ´Ù·ç°í ÀÖ´Ù)


2.3.4절. F_GETOWN/F_SETOWN

¹Ù·Î À­Àå¿¡¼­ ¿ì¸®´Â F_GETFL/F_SETFL À» ÀÌ¿ëÇØ¼­ ÆÄÀÏÁöÁ¤ÀÚÀÇ Æ¯¼ºÀ» º¯°æÇÏ´Â ¹ýÀ» ¹è¿ü¾ú´Ù. ±×Áß¿¡¼­ ºñµ¿±â ÀÔÃâ·Â ¼³Á¤À» À§ÇÑ O_ASYNC Ç÷¹±×¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀ» ¹è¿ü¾ú´Âµ¥, F_GETOWN/F_SETOWN Àº ÀÌ ºñµ¿±â ÀÔÃâ·Â°ú °ü·ÃµÇ¾î¼­ »ç¿ëµÇ´Â Ç÷¡±×ÀÌ´Ù.

À̵é Ç÷¹±×¸¦ »ç¿ëÇÔÀ¸·Î½á ºñµ¿±â ÀÔÃâ·Â ¸ðµå·Î ÆÄÀÏÁöÁ¤ÀÚ°¡ ¼³Á¤µÇ¾î ÀÖÀ»¶§, ¾î¶² ÇÁ·Î¼¼½º(ȤÀº ±×·ì) ¾ÆÀ̵ð·Î ºÎÅÍ ¿À´Â ½Ã±×³ÎÀ» ¹ÞÀ»Áö¸¦ ÁöÁ¤ÇØÁÙ¼ö ÀÖ´Ù. ¿ª½Ã ÀÚ¼¼ÇÑ ³»¿ëÀº ¸®´ª½º I/O ¸ðµ¨ ¹®¼­¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.