¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 53¹ø Á¦ ¸ñ:[moohou] Unix System Programming 1 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:35 ÀÐÀ½:6378 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 1 - ±è¼ºÈ£(moohou) ___________________________________________ UNIX ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö Á¦1Àå ±âº»°³³ä°ú ¿ë¾î 1.1 È­ÀÏ UNIX ½Ã½ºÅÛ¿¡ ´ëÇÑ Á¤º¸´Â È­ÀÏ¿¡ ÀúÀåµÈ´Ù. UNIX È­ÀÏÀº º¹ÀâÇÏ°í Ư¼öÇÑ ±¸Á¶ (À妽º È­Àϱ¸Á¶ µî)¸¦ °³¹ßÇÒ ¼ö ÀÖµµ·Ï ¼³°èµÈ ¸íÈ®ÇÏ°í ÀϹÝÀûÀÎ °³ ³äÀÌ´Ù. ÇÑÁÙÀÇ ³¡À» ¾Ë·ÁÁÖ´Â °³Ç๮ÀÚ´Â, UNIX¿¡ °üÇÑ ÇÑ ´ÜÁö ½Ã½ºÅÛ À¯Æ¿ ¸®Æ¼(utility)¿Í »ç¿ëÀÚÇÁ·Î±×·¥¿¡ ÀÇÇØ ÀÐÈ÷°í ¾²¿©Áö´Â ÇϳªÀÇ ¹®ÀÚ¿¡ ºÒ°ú ÇÏ´Ù. 1.1.1 µð·ºÅ丮¿Í °æ·ÎÀ̸§ µð·ºÅ丮´Â È­ÀÏÀÇ ÁýÇÕÀ¸·Î, È­ÀϽýºÅÛÀÇ ³í¸®ÀûÀÎ ±¸¼ºÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù. UNIX È­ÀÏÀÇ ÀúÀåÀº °¢ Áß°£ ³ëµå(non-terminal node)°¡ °¢ µð·ºÅ丮¿¡ ÇØ´çµÇ ´Â °èÃþÀûÀÎ Æ®¸®±¸Á¶·Î¼­ »ý°¢µÉ ¼ö ÀÖ´Ù. ÀÌ Æ®¸®ÀÇ ¸Ç²À´ë±â´Â ·çÆ® µð·ºÅä ¸®(root directory)¶ó ºÒ¸®´Â ÇÑ°³ÀÇ µð·ºÅ丮ÀÌ´Ù. '/'¹®ÀÚ·Î ½ÃÀÛÇÏÁö¾Ê´Â °æ·ÎÀ̸§Àº »ó´ëÀûÀÎ (relative) °æ·ÎÀ̸§À̶ó°í ºÎ¸£°í, ÇöÀç »ç¿ëÀÚ°¡ ÀÛ¾÷ ÇÏ°í ÀÖ´Â µð·ºÅ丮(current working directory)¿¡ ´ëÇÏ¿© »ó´ëÀûÀÎ °æ·Î¸¦ ¾Ë ·ÁÁØ´Ù. °æ·ÎÀ̸§ÀÇ °¢ ¿ä¼Ò(component)´Â ÃÖ´ë 14¹®ÀÚ±îÁö¸¸ Çã¿ëµÈ´Ù´Â °ÍÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù. 1.1.2. ¼ÒÀ¯±Ç°ú Çã°¡ ¼ÒÀ¯±Ç(ownership)Àº Çã°¡(permission)¿Í °°Àº È­ÀÏÀÇ ¼Ó¼ºÀ» ¹Ù²Ü¼ö ÀÖ´Â ±Ç ¸®¸¦ ºÎ¿©ÇÑ´Ù. 1.1.3. È­ÀÏ°³³ä°ú ÀϹÝÈ­ UNIX´Â È­ÀÏ °³³äÀ» µð½ºÅ© È­ÀÏ »Ó¸¸ ¾Æ´Ï¶ó ÁÖº¯ÀåÄ¡¿Í ÇÁ·Î¼¼½º°£ Åë½Åä ³Î(interprocess communication channel)±îÁö È®ÀåÇÑ´Ù. 1.2. ÇÁ·Î¼¼½º UNIX¿ë¾î·Î¼­ ÇÁ·Î¼¼½º´Â ´ÜÁö ¼öÇàÁßÀÎ ÇÁ·Î±×·¥À» ¸»ÇÑ´Ù. ÇÁ·Î¼¼½º¸¦ »ý¼º ÇÏ´Â °¡Àå ½¬¿î ¹æ¹ýÀº UNIX ¸í·É¾î 󸮱⠶Ǵ ½© (shell)¿¡ ¸í·ÉÀ» ÇÏ´Â °Í ÀÌ´Ù. 1.2.1. ÇÁ·Î¼¼½º°£ Åë½Å UNIX´Â ´Ù¾çÇÑ ÇÁ·Î¼¼½º°£ Åë½Å ¹æ¹ýµéÀ» »ç¿ëÇÏ¿© ÇÁ·Î¼¼½ºµéÀÌ ¼­·Î Çù·ÂÇÏ µµ·Ï ÇÑ´Ù. ´Ù¸¥ UNIX ÇÁ·Î¼¼½º°£ Åë½Å±â´ÉÀ¸·Î¼­ signalÀÌ ÀÖ´Ù. ÀÌ°ÍÀº ÀÎÅÍ ·´Æ®(interrupt)¸¦ ±âÃÊ·Î ÇÏ´Â Åë½Å¸ðµ¨À» Á¦°øÇÑ´Ù. ¶Ç ´Ù¸¥ ±â´ÉÀ¸·Î´Â °ø À¯¸Þ¸ð¸®(shared memory)¿Í ¼¼¸¶Æ÷¾î(semaphore)°¡ ÀÖ´Ù. 1.3. ½Ã½ºÅÛÈ£Ãâ°ú ¶óÀ̺귯¸® ¼­ºê·çƾ ½Ã½ºÅÛÈ£ÃâÀº ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚ°¡ UNIX Ä¿³Î(kernel)·Î µé¾î°¡±â À§ÇÑ ¼ö´Ü ÀÌ´Ù. Ä¿³ÎÀº ¼ÒÇÁÆ®¿þ¾îÀÇ ÇÑ ºÎºÐÀ¸·Î¼­ Ç×»ó ¸Þ¸ð¸®¿¡ Á¸ÀçÇÏ¿© UNIX ½Ã½º ÅÛÀÇ ÇÁ·Î¼¼½º ½ºÄÉÁÙ¸µ(process scheduling)°ú I/O Á¦¾î¸¦ ´Ù·é´Ù. º»ÁúÀûÀ¸ ·Î Ä¿³ÎÀº UNIX¿¡¼­ ÁøÁ¤ÇÑ ¿î¿µÃ¼Á¦·Î¼­ °£ÁֵǴ ºÎºÐÀÌ´Ù. Ä¿³Î¿¡ ÀÇÇؼ­ ¸ðµç »ç¿ëÀÚ ÇÁ·Î¼¼½º¿Í ¸ðµç È­ÀÏ ½Ã½ºÅÛ Á¢±ÙµéÀº °¨µ¶µÇ°í Á¦¾îµÈ´Ù. ½Ã½º ÅÛÈ£Ãâ¿¡ ÀÇÇØ ¼öÇàµÇ´Â ÄÚµåÀÇ ´ëºÎºÐÀº È£Ãâ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó ½ÇÁ¦ Ä¿³Î ±× ÀÚüÀÎ Á¡ÀÌ´Ù. ´Ù¸¥ ¸»·Î È£Ãâ ÇÁ·Î±×·¥Àº Ä¿³Î¿¡ ÀÇÇØ Á¦°øµÇ´Â ±â´ÉÀ» Á÷Á¢ ÀÌ¿ëÇÑ´Ù. »ç¿ëÀÚ ÇÁ·Î¼¼½º¿Í Ä¿³Î »çÀÌÀÇ Àüȯ(switch) Àº º¸Åë ¼ÒÇÁÆ® ¿þ¾î ÀÎÅÍ·´Æ® ÀýÂ÷¸¦ ÅëÇÏ¿© ÀÌ·ç¾îÁø´Ù. ÇÁ·Î¼¼½ºÀÇ °æ¿ì ½Ã½ºÅÛÈ£Ãâ ¸í·ÉÀº »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ°í, Á¸ÀçÇÏ´Â ÇÁ·Î¼¼½º¸¦ Á¾·áÇÏ°í, ÇÁ·Î¼¼½º »óÅ¿¡ ´ëÇØ Á¤º¸¸¦ ¾ò°í, µÎ ÇÁ·Î¼¼½º »çÀÌ¿¡ Åë½Å ä³ÎÀ» ¼³Ä¡ÇÏ´Â °ÍÀ» Æ÷ÇÔÇÑ´Ù. UNIX ½Ã½ºÅÛÀº ½Ã½ºÅÛÈ£Ãâ »Ó¸¸ ¾Æ´Ï¶ó ¶óÀ̺귯¸®¿Í Ç¥ÁØ ¼­ºê·çƾÀ» Á¦°øÇÑ ´Ù. ÀÌ¿¡ ´ëÇÑ °¡Àå Áß¿äÇÑ ¿¹´Â Ç¥ÁØ I/O ¶óÀ̺귯¸®ÀÌ´Ù. ÀÌ°ÍÀº È­ÀÏ Á¢±Ù ÇÁ¸®¹ÌƼºê·Î ±¸¼ºµÈ ½Ã½ºÅÛÈ£Ãâ¿¡ ÀÇÇؼ­´Â Á¦°øµÇÁö ¾Ê´Â Çü½ÄÈ­µÈ º¯È¯ (formatted conversion)°ú ÀÚµ¿ ¹öÆÛ¸µ(automatic buffering)µî°ú °°Àº ±â´ÉÀ» Á¦°øÇÑ´Ù. ¶ÇÇÑ ÀÌ·¯ÇÑ ±â´ÉµéÀ» È¿À²ÀûÀ¸·Î ¼öÇàÇϵµ·Ï ÇÑ´Ù. ±×·¯³ª Ç¥ÁØ I/O ¼­ºê·çƾµéÀº ±Ã±ØÀûÀ¸·Î ½Ã½ºÅÛÈ£Ãâ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÑ´Ù. À̰͵éÀº ºÐ ¸®µÈ ºÎ½Ã½ºÅÛ(subsystem)ÀÌ ¾Æ´Ï¶ó ½Ã½ºÅÛÈ£Ãâ ÇÁ¸®¹ÌƼºê¿¡ ±âÃÊÇÑ È­ÀÏÁ¢±Ù ±â´É ÀÇ ´Ù¸¥ ¸éó·³ º¸ÀδÙ. ¿©±â¼­ ÁÖ¾ÈÁ¢Àº ȯ°æ(environment)°ú Á¢ÃËÇÏ´Â ¾î¶² ÇÁ·Î¼¼½ºµµ ½Ã½ºÅÛÈ£ÃâÀ» »ç¿ëÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 54¹ø Á¦ ¸ñ:[moohou] Unix System Programming 2 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:36 ÀÐÀ½:4596 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 2 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦2Àå UNIX È­ÀÏ Á¢±Ù ÇÁ¸®¹ÌƼºê 2.1.1. ¼­·Ð UNIX È­ÀÏ Á¢±Ù ÇÁ¸®¹ÌƼºê -------------------------------------------- À̸§ ÀÇ¹Ì -------------------------------------------- open Àаųª ¾²±âÀ§ÇØ È­ÀÏÀ» ¿¬´Ù. creat ºó È­ÀÏÀ» »ý¼ºÇÑ´Ù. close ¾Õ¼­ ¿­·ÁÁø È­ÀÏÀ» ´Ý´Â´Ù. read È­ÀϷκÎÅÍ Á¤º¸¸¦ ÃßÃâÇÑ´Ù. lseek È­ÀÏ ¾ÈÀÇ Æ¯Á¤ ¹ÙÀÌÆ®·Î ¿Å±ä´Ù. unlink È­ÀÏÀ» Á¦°ÅÇÑ´Ù. -------------------------------------------- ¼º°øÇϸé 0 , ½ÇÆÐÇϸé -1 À» µ¹·ÁÁØ´Ù. ¸ðµç °³¹æµÈ È­ÀÏÀº ÇÁ·Î¼¼½º°¡ Á¾·á ÇÒ¶§ ÀÚµ¿ÀûÀ¸·Î ´ÝÈù´Ù. 2.1.2. open ½Ã½ºÅÛ È£Ãâ Á¸ÀçÇÏ´Â È­ÀÏÀ» Àаųª ¾²±âÀü¿¡ ¹Ýµå½Ã open ½Ã½ºÅÛÈ£Ãâ·Î È­ÀÏÀ» °³¹æÇØ ¾ß ÇÑ´Ù. #include int filedes, flsgs; char *pathname; . . filedes = open(pathname, flags); ù¹ø° Àμö pathnameÀº °³¹æµÉ È­ÀÏÀÇ °æ·ÎÀ̸§À» °®°í ÀÖ´Â ¹®ÀÚ¿­¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù. È­ÀÏÀº openÀÌ È£ÃâµÇ±âÀü¿¡ ¹Ýµå½Ã Á¸ÀçÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸ ¸é ¿À·ù°¡ ¹ß»ýÇÑ´Ù. fcntl.h ¿¡¼­ Á¤ÀǵǴ »ó¼ö - O_RDONLY Àб⸸ Çã¿ëÇÏ´Â °³¹æ È­ÀÏ - O_WRONLY ¾²±â¸¸ Çã¿ëÇÏ´Â °³¹æ È­ÀÏ - O_RDWR ÀÐ°í ¾²´Â °ÍÀ» Çã¿ëÇÏ´Â °³¹æ È­ÀÏ ¿À·ù°¡ ¹ß»ýÇϸé openÀº -1À» µ¹·ÁÁØ´Ù. ¿À·ù´Â È­ÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì ¹ß»ýÇÑ´Ù. ¿À·ùÁ¶»ç(error checking)¸¦ ½Ã½ºÅÛÈ£ÃâÀ» »ç¿ëÇÏ´Â ¸ðµç ÇÁ·Î±×·¥ ¿¡ ´ëÇؼ­ ÇØ ÁÖ´Â °ÍÀº ¹ß»ýÇÒ Áöµµ ¸ð¸£´Â ¿À·ù¸¦ °í·ÁÇÒ¶§ ¸Å¿ì À¯ÀÍÇÏ´Ù. ÁÖÀÇ»çÇ×(caleats) 1. ¼öÇàÁßÀÎ ÇÁ·Î±×·¥¿¡ ÀÇÇØ µ¿½Ã¿¡ °³¹æµÉ ¼ö ÀÖ´Â È­ÀÏÀÇ ¼ö¿¡´Â Á¦ÇÑÀÌ ÀÖ´Ù.(º¸Åë20) ¶ÇÇÑ Á¸ÀçÇÏ´Â ¸ðµç ÇÁ·Î¼¼½º¿¡ ÀÇÇØ °³¹æµÉ ¼ö ÀÖ´Â È­ÀÏ ÀÇ ¼ö¿¡µµ Á¦ÇÑÀÌ ÀÖ´Ù. ÀÌ°ÍÀº Ä¿³Î¾È¿¡ Àִ ǥÀÇ Å©±â¿¡ ÀÇÇØ °áÁ¤µÈ ´Ù. 2. Ãʱâ UNIX¿¡´Â ÀÎŬ·çµå È­ÀÏ fcntl.h°¡ Á¸ÀçÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ ½ÇÁ¦ ¼ý ÀÚ°¡ flags Àμö·Î¼­ »ç¿ëµÇ¾ú´Ù. 2.1.3. creat ½Ã½ºÅÛ È£Ãâ creat ½Ã½ºÅÛÈ£ÃâÀº »õ·Î¿î È­ÀÏÀ» »ý¼ºÇϰųª Á¸ÀçÇÏ´Â È­ÀÏÀÇ ±æÀ̸¦ 0 À¸ ·Î °íÃijõ±â À§ÇØ »ç¿ëµÈ´Ù. open °ú °°ÀÌ creat È£ÃâÀº À½ÀÌ ¾Æ´Ñ È­ÀÏ ±â¼ú ¾î ¶Ç´Â ¿À·ùÄÚµå -1À» µ¹·ÁÁØ´Ù. int filedes, mode; char *pathname; . . filedes = creat(pathname, mode); ù¹ø° Àμö pathnameÀº UNIX °æ·ÎÀ̸§À» ³ªÅ¸³½´Ù. ÀÌ°ÍÀº »õ È­ÀÏÀÇ À̸§°ú À§Ä¡, ¶Ç´Â Á¸ÀçÇÏ´Â È­ÀÏÀÇ À̸§À» ÁöÁ¤ÇÑ´Ù. µÎ¹ø° Àμö mode ´Â Á¤¼ö°ªÀ» °®°í È­ÀÏÀÇ Á¢±Ù Çã°¡(access permission)¸¦ ºÎ¿©ÇÑ´Ù. mode ÀÇ °ªÀº È­ÀÏÀÌ »ý¼ºµÉ ¶§¸¸ Àǹ̸¦ °®°í, Á¸ÀçÇÏ´Â È­ÀÏÀÇ °æ¿ì¿¡´Â Àǹ̸¦ Áö´ÏÁö ¸øÇÑ´Ù. Á¸ÀçÇÏ´Â È­ÀÏÀÇ °æ¿ì´Â ¿ø·¡ÀÇ Çã°¡¸¦ °è¼Ó °¡Áö°Ô µÈ´Ù. creat ´Â ¾²±â Àü¿ë À¸·Î¸¸ È­ÀÏÀ» °³¹æÇÑ´Ù´Â °Í¿¡ À¯ÀÇÇ϶ó. 2.1.4. close ½Ã½ºÅÛ È£Ã⠽ýºÅÛ È£Ãâ close´Â open°ú ¹Ý´ëÀÌ´Ù. close È£Ãâ ÇÁ·Î¼¼½º°¡ È­ÀÏ¿¡ °ü·ÃµÈ ÀÛ¾÷À» ³¡³Â ´Ù´Â °ÍÀ» ½Ã½ºÅÛ¿¡ ¾Ë·ÁÁØ´Ù. int retval, filedes; . . retval = close(filedes); close °¡ ¼º°øÇϸé 0 À» µ¹·ÁÁÖ°í, ¿À·ù°¡ ¹ß»ýÇϸé(Á¤´çÇÑ È­ÀÏ ±â¼ú¾î¸¦ ÀÎ ¼ö·Î °®Áö ¾ÊÀ» °æ¿ì) -1À» µ¹·ÁÁØ´Ù. 2.1.5. read ½Ã½ºÅÛ È£Ãâ read ´Â È­ÀϷκÎÅÍ ÀÓÀDZæÀÌÀÇ ¹®ÀÚ³ª ¹ÙÀÌÆ®¸¦ È£Ãâ ÇÁ·Î±×·¥ÀÇ Á¦¾îÇÏ¿¡ ÀÖ´Â ¹öÆÛ·Î º¹»çÇϱâ À§ÇØ »ç¿ëµÈ´Ù. À̶§ ¹öÆÛ´Â char ÀÇ ¹è¿­·Î¼­ Á¤ÀÇµÈ ´Ù. int nread, filedes, n; char *bufptr; . . nread = read(filedes, bufptr, n); read ÀÇ Ã¹¹ø° Àμö filedes ´Â ¾Õ¼­ È£ÃâÇÑ open À̳ª creat ¿¡ ÀÇÇؼ­ ¸¸ µé¾îÁø È­ÀÏ ±â¼ú¾îÀÌ´Ù. µÎ¹ø° Àμö bufptr Àº ÀÚ·á°¡ º¹»çµÇ¾îÁú ¹®ÀÚ ¹è¿­ ¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù. »õ¹ø° Àμö´Â È­ÀϷκÎÅÍ ÀоîÁú ¹ÙÀÌÆ®ÀÇ ¼ö¸¦ °¡Áö´Â ¾çÀÇ Á¤¼ö°ªÀÌ´Ù. read ·ÎºÎÅÍÀÇ º¹±Í°ª nread ´Â ½ÇÁ¦·Î ÀÐÈù ¹ÙÀÌÆ®ÀÇ ¼ö¸¦ ³ªÅ¸³½´Ù. read ÀÇ °æ¿ì, ½Ã½ºÅÛÀº °¢ È£Ãâ ÈÄ¿¡ ÀÐÇôÁø ¹ÙÀÌÆ®ÀÇ ¼ö¸¸Å­ Àбâ -¾²±â Æ÷ÀÎÅ͸¦ ÀüÁø ½ÃŲ´Ù. read È£Ãâ¿¡ ÀÇÇØ ¿äûµÈ ¹®ÀÚÀÇ ¼ö°¡ È­ÀÏ¿¡ ³² ¾ÆÀÖ´Â ¹®ÀÚÀÇ ¼öº¸´Ù Ŭ °æ¿ì ½Ã½ºÅÛÀº ³²¾ÆÀÖ´Â ¹®Àڵ鸸 ¿Å±â°í, º¹±Í°ªÀ» ÀûÀûÇÏ°Ô °íÄ£´Ù. ÀÌÁ¦ ÀÌÈÄ¿¡ È£ÃâµÇ´Â read ÀÇ º¹±Í°ªÀº 0 ÀÌ µÈ´Ù. Áï, ³² ¾ÆÀÖ´Â ¹®ÀÚ°¡ Çϳªµµ ¾ø°Ô µÈ´Ù. »ç½Ç, read ·ÎºÎÅÍ º¹±Í°ªÀÌ 0 Àΰ¡¸¦ Á¶»ç ÇÏ´Â °ÍÀÌ ÇÁ·Î±×·¥ ¾È¿¡¼­ È­ÀÏÀÇ ³¡À» Á¶»çÇÏ´Â º¸ÅëÀÇ ¹æ¹ýÀÌ´Ù. 2.1.6. write ½Ã½ºÅÛ È£Ãâ write ½Ã½ºÅÛÈ£ÃâÀº read ÀÇ Á¤¹Ý´ëÀÌ´Ù. ÀÌ È£ÃâÀº ¹®ÀÚ ¹è¿­·Î¼­ Á¤ÀÇµÈ ÇÁ ·Î±×·¥ ¹öÆÛ·Î ºÎÅÍ ÀڷḦ ¿ÜºÎÈ­ÀÏ·Î º¹»çÇÑ´Ù. int nwrite, filedes, n; char *bufptr; . . nwrite = write(filedes, bufptr, n); n Àº ¾²¿©Áú ¹®ÀÚÀÇ ¼öÀÎ ¾ç¼öÀÌ´Ù. nwrite ·ÎÀÇ º¹±Í°ªÀº ¾²¿©Áø ¹®ÀÚÀÇ ¼ö ¶Ç´Â ¿À·ùÄÚµå -1 ÀÌ´Ù. ½ÇÁ¦ÀûÀ¸·Î -1 ÀÌ ¾Æ´Ï¸é nwrite ´Â °ÅÀÇ n °ú µ¿ÀÏÇÏ ´Ù. ¸¸¾à n º¸´Ù ÀÛÀ¸¸é ¹«¾ð°¡ À߸øµÈ ÀÏÀÌ ¹ß»ýÇß´Ù. È­ÀÏÀº óÀ½¿¡ 0 ¹ÙÀÌ Æ® ±æÀÌ·Î ÃʱâÈ­ µÈÈÄ write È£ÃâÀÌ ÀÖÀ» ¶§¸¶´Ù È­ÀÏÀÇ ³¡¿¡ ÀÚ·á°¡ ´õÇØÁø ´Ù. Àбâ-¾²±â Æ÷ÀÎÅÍ´Â ¸¶Áö¸· ¹ÙÀÌÆ® °¡ ¾²¿©Áø ÈÄ °ð¹Ù·Î À§Ä¡¸¦ ¹Ù²Û´Ù. 2.1.7. copyfile ¿¹ -- »ý·« 2.1.8. read, write ¿Í È¿À²¼º -- »ý·« 2.1.9. lseek °ú ÀÓÀÇ Á¢±Ù »ç¿ëÀÚ´Â lseek ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÏ¿© Àбâ-¾²±â Æ÷ÀÎÅÍÀÇ À§Ä¡, Áï ´ÙÀ½¿¡ Àаųª ¾µ ¹ÙÀÌÆ®ÀÇ À§Ä¡¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ lseek Àº È­ÀÏ¿¡ ´ëÇÑ ÀÓ ÀÇ Á¢±ÙÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù. long newpos, offset, lseek(); int filedes, direction; . . newpos = lseek(filedes, offset, direction); filedes ´Â °³¹æµÇ¾î ÀÖ´Â È­ÀÏÀÇ È­Àϱâ¼ú¾îÀÌ´Ù. long Á¤¼öÇü offset Àº ÀÐ ±â-¾²±â Æ÷ÀÎÅÍÀÇ »õ À§Ä¡¸¦ °áÁ¤ÇÑ´Ù. ÀÌ°ÍÀº ½ÃÀÛÀ§Ä¡¿¡ ´õÇØÁú ¹ÙÀÌÆ®ÀÇ ¼ö ¸¦ ÁöÁ¤ÇÑ´Ù. ½ÃÀÛÀ§Ä¡´Â direction ¿¡ ÀÇÇØ °áÁ¤µÈ´Ù. direction ÀÇ °ªÀÌ 0 À̸é, offset ÀÌ È­ÀÏÀÇ ¸Ç¾Õ¿¡¼­ºÎÅÍ ´õÇØÁø´Ù. °ªÀÌ 1 À̸é, offset ÀÌ È­ÀÏ Æ÷ÀÎÅÍÀÇ ÇöÀçÀ§Ä¡¿¡ ´õÇØÁø´Ù. °ªÀÌ 2 À̸é, È­ÀÏÀÇ ¸¶Áö¸· ¹ÙÀÌÆ®ÀÇ ¹øÈ£¿¡ ´õÇØÁø´Ù. ÁÖÀÇ ÇØ¾ß ÇÒ ¸î°¡Áö ÁÖ¾ÈÁ¡. 1. newpos ¿Í offset µÑ´Ù long Á¤¼öÇüÀÌ´Ù. 2. offset Àº À½¼ö°¡ µÉ¼ö ÀÖ´Ù. 3. È­ÀÏÀÇ ³¡º¸´Ù ´õ À§ÀÇ À§Ä¡¸¦ ÁöÁ¤ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. 2.1.10. È£ÅÚÀÇ ¿¹ -- »ý·« 2.1.11. ½Ã½ºÅÛ È£Ãâ unlink ½Ã½ºÅÛ È£Ãâ unlink ´Â È­ÀÏÀ» ½Ã½ºÅÛÀ¸·ÎºÎÅÍ Á¦°ÅÇϱâ À§ÇØ »ç¿ëµÈ´Ù. ÀÌ°Í Àº ÀÓ½ÃÀûÀÎ ÀÛ¾÷È­ÀÏÀ» ´Ù·ç´Â µ¥ À¯¿ëÇÏ´Ù. int retval; char *filename; . . retval = unlink(filename); unlink ´Â Á¦°ÅÇÒ È­ÀÏÀÇ À̸§À» °¡Áø ¹®ÀÚ¿­·Î µÈ ÇÑ°³ÀÇ Àμö¸¸À» °¡Áø´Ù. unlink ´Â ¼º°øÇϸé 0 À» ½ÇÆÐÇϸé -1À» µ¹·ÁÁØ´Ù. 2.1.12. open È£ÃâÀÇ È®ÀåµÈ Ư¡ open ÀÌ ºÎ°¡ÀûÀΠƯ¡À» Á¦°øÇÑ´Ù. ºÎ°¡ÀÇ »ó¼ö O_APPEND ¸¦ ¼Ò°³ÇÑ´Ù. ¸¸ÀÏ O_APPEND °¡ ÁöÁ¤µÇ¸é, ¾²±â°¡ ÀϾ ¶§¸¶´Ù È­ÀÏÀÇ ³¡¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. ÀÌ °ÍÀº ÇÁ·Î±×·¡¸Ó °¡ ¿ø·¡ÀÇ ³»¿ëÀº ±×´ë·Î µÎ°í È­ÀÏÀÇ ³¡¿¡ ÀڷḦ µ¡ºÙÀ̱⠸¦ ¿øÇÏ´Â °æ¿ì¿¡ À¯¿ëÇÏ´Ù. O_WRONLY ¿Í O_APPEND °¡ ±âÈ£ '|' (c ÀÇ ºñÆ® ´Ü À§ OR ¸í·É¾î)¿¡ ÀÇÇØ °áÇյǴ ¹æ¹ý¿¡ À¯ÀÇÇ϶ó. filedes = open("yetanother", O_WRONLY|O_AP PPEND); open Àº creat ¿Í À¯»çÇÑ ¹æ¹ýÀ¸·Î È­ÀÏÀ» »ý¼ºÇϰųª È­ÀÏÀÇ ³»¿ëÀ» ¹éÁöÈ­ ÇÏ´Â µ¥ »ç¿ë µÉ ¼ö ÀÖ´Ù. ¼¼°¡Áö ±âº» Ç÷¡±×ÁßÀÇ Çϳª¿Í fcntl.h ¿¡ ÀÖ´Â ºÎ °¡ÀÇ Ç÷¡±×, O_CREAT, O_TRUNC, O_EXCL ¸¦ °áÇÕÇÔÀ¸·Î½á ¾òÀ» ¼ö ÀÖ´Ù. fd = open("file", O_WRONLY|O_CREAT|O_AP PPEND, 0644); ¸¸ÀÏ È­ÀÏÀÇ ³»¿ëÀ» ¹éÁöÈ­ÇÏ°í ½ÍÀ¸¸é, O_CREAT ¿Í´Â º°°³·Î O_TRUNC ¸¦ »ç ¿ëÇØ¾ß ÇÑ´Ù. fd = open("file", O_WRONLY|O_CREAT|O_TR UNC, 0644); O_EXCL Àº µ¶¸³ÀûÀ¸·Î »ç¿ëµÉ ¼ö ¾ø´Ù. ±×·¯³ª O_CREAT ¿Í ÇÔ²² ÁöÁ¤µÇ¸é, È­ ÀÏÀÌ Á¸ÀçÇÒ ¶§´Â open ÀÌ ½ÇÆÐÇÏ°Ô µÈ´Ù. fd = open("lock", O_WRONLY|O_CREAT|O_EX CL, 0644); Àº È­ÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì´Â È­ÀÏ lock À» »ý¼ºÇÏ°í, È­ÀÏÀÌ Á¸ÀçÇÏ¸é ½Ç ÆÐ(-1À» µ¹·ÁÁÜ) Ç϶ó´Â ¸í·ÉÀÌ´Ù. ÀÌ°ÍÀº µ¿½Ã¿¡ ¿©·¯ ÇÁ·Î¼¼½º°¡ °°Àº È­ÀÏ À» »ý¼ºÇÒ ¼ö ÀÖ´Â »óȲ¿¡¼­ ¿ì¿¬È÷ È­ÀÏÀÌ ÈѼյǴ °ÍÀ» ¸·±â À§ÇÑ ¹æ¹ýÀ¸·Î À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Ù. 2.1.13. ½Ã½ºÅÛ È£Ãâ fcntl fcntl ½Ã½ºÅÛ È£ÃâÀº ÀÌ¹Ì ¿­·ÁÀÖ´Â È­ÀÏ¿¡ ´ëÇؼ­ Á¦¾î¸¦ Çϱâ À§ÇØ »ç¿ëµÈ ´Ù. fcntl Àº ÇϳªÀÇ Àß Á¤ÀÇµÈ ±â´ÉÀ» °¡Áø ½Ã½ºÅÛ È£ÃâÀÌ ¾Æ´Ï¶ó ¿©·¯ ±â´É À» ¼öÇàÇÏ´Â ´Ù¼Ò ÀÌ»óÇÑ ½Ã½ºÅÛ È£ÃâÀÌ´Ù. #include /* *NB: type of 'args' can vary */ int status, cmd, filedes, args; . . status = fcntl(filedes, cmd, args); È­ÀÏ°ú ÇÁ·Î¼¼½ºÀÇ »óÈ£ÀÛ¿ë¿¡ °ü°èµÈ °Í F_GETFL °ú F_SETFL µîÀÌ ÀÖ´Ù. F_GETFL Àº open ¿¡ ÀÇÇØ ÁöÁ¤µÈ ÇöÀç È­ÀÏ »óÅ Ç÷¯±×(current file status flags) ¸¦ fcntl ÀÌ µ¹·Á ÁÖµµ·Ï Çϱâ À§ÇØ »ç¿ëµÈ´Ù. F_SETFL Àº È­ÀÏ¿¡ °ü·Ã µÈ È­ÀÏ»óÅ ÇÁ·¡±×¸¦ ´Ù½Ã ÁöÁ¤Çϱâ À§ÇØ »ç¿ëµÈ´Ù. 2.2. Ç¥ÁØ ÀÔ·Â, Ç¥ÁØ Ãâ·Â, Ç¥ÁØ ¿À·ù 2.2.1. ±âº»°³³ä UNIX ½Ã½ºÅÛÀº ¼öÇàÁßÀÎ ÇÁ·Î±×·¥¿¡ ´ëÇؼ­ ÀÚµ¿ÀûÀ¸·Î ¼¼°³ÀÇ È­ÀÏÀ» °³¹æÇÑ ´Ù. ±×°ÍµéÀº °¢°¢ Ç¥ÁØÀÔ·Â, Ç¥ÁØÃâ·Â, Ç¥ÁØ¿À·ù¶ó ºÒ¸®°í, ÇÁ·Î±×·¥ ¾È¿¡¼­ °¡°¡ È­ÀÏ ±â¼ú¾î 0, 1, 2 ·Î¼­ Ç×»ó ½Äº°µÈ´Ù. 2.2.2. ÇÁ·Î±×·¥ ¿¹ io -- »ý·« 2.2.3. Ç¥ÁØ¿À·ù Ç¥ÁØ¿À·ù´Â ¿À·ù¿Í °æ°í ¸Þ½ÃÁö¸¦ ÁÖ±âÀ§ÇÑ ´Ù¼Ò Ưº°ÇÑ Ãâ·Â ä³ÎÀÌ´Ù. 2.3. I/O ¶óÀ̺귯¸® : ¹Ì¸® »ìÆ캸±â Ç¥ÁØ I/O ¿Í ½Ã½ºÅÛ È£Ãâ ÇÁ¸®¹ÌƼºê »çÀÌÀÇ °¡Àå ºÐ¸íÇÑ Â÷ÀÌÁ¡Àº È­ÀÏÀÌ ±â ¼úµÇ´Â ¹æ¹ý¿¡ ÀÖ´Ù. Á¤¼öÇü È­ÀÏ ±â¼ú¾î ´ë½Å¿¡ Ç¥ÁØ I/O ·çƾÀº ½ºÆ®¸² (stream)À̶ó ºÒ¸®´Â °´Ã¼(entity)¸¦ °¡Áö°í ÀÛ¾÷À» ÇÑ´Ù. ½ºÆ®¸²Àº FILEÀ̶ó ºÒ¸®´Â ±¸Á¶Çü(structure type)À¸·Î ³ªÅ¸³½´Ù. fprintf ·Î ¿À·ù¸Þ½ÃÁö Ãâ·Â printf ´Â ƯÁ¤ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϱâ À§ÇØ »ç¿ëµÈ´Ù. #include /*for stderr defini tion */ . . fprintf(stderr, "error number %d\n",err no); ÀÏ°ü¼ºÀ» À§ÇØ Ç¥ÁØ¿À·ù¸¦ »ç¿ëÇÏ´Â ¸í·É¾î³ª ÇÁ·Î±×·¥¿¡¼­´Â fprintf ¸¦ »ç ¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. 2.4. errno º¯¼ö¿Í ½Ã½ºÅÛÈ£Ãâ ÇÁ·Î±×·¡¸Ó´Â C ÇÁ·Î±×·¥¾È¿¡¼­ Á¤¼öÇüÀÇ extern º¯¼ö·Î ¼±¾ðÇÏ¿© errno ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. extern int errno; 2.4.1. perror ¼­ºê·çƾ errno »Ó¸¸ ¾Æ´Ï¶ó UNIX ´Â perror À̶ó ºÒ¸®´Â ·çƾ(½Ã½ºÅÛ È£ÃâÀÌ ¾Æ´Õ)À» Á¦°øÇÑ´Ù. ÀÌ°ÍÀº ÇϳªÀÇ ¹®ÀÚ¿­ Àμö¸¦ °¡Áø´Ù. perror ÀÌ È£ÃâµÇ¸é, ·çƾ¿¡ Àü´ÞµÈ ¹®ÀÚ¿­ Àμö, ÄÝ·Ð, errno º¯¼öÀÇ ÇöÀç °ª¿¡ ´ëÀÀµÇ´Â ºÎ°¡ÀÇ ¸Þ½ÃÁö µîÀ¸·Î ±¸¼ºµÇ´Â ¸Þ½ÃÁö¸¦ Ç¥ÁØ ¿À·ù·Î Ãâ·ÂÇÑ´Ù. ¿À·ù ¸Þ½ÃÁö¸¦ Ç¥ÁØ Ãâ·ÂÀÌ ¾Æ´Ï¶ó Ç¥ÁØ¿À·ù·Î Ãâ·ÂÇϱ⠶§¹®¿¡ ´õ À¯¿ëÇÏ´Ù. perror("error opening nonesuch"); ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 55¹ø Á¦ ¸ñ:[moohou] Unix System Programming 3 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:37 ÀÐÀ½:3874 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 3 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦3Àå. ¹®¸Æ»óÀÇ È­ÀÏ 3.1. ´ÙÁß »ç¿ëÀÚ È¯°æ¿¡¼­ÀÇ È­ÀÏ 3.1.1. »ç¿ëÀÚ¿Í ¼ÒÀ¯±Ç UNIX ½Ã½ºÅÛÀÇ ¸ðµç È­ÀÏÀº ½Ã½ºÅÛÀÇ »ç¿ëÀÚÁß Çϳª¿¡ ÀÇÇØ ¼ÒÀ¯µÈ´Ù. ÀÌ »ç ¿ëÀÚ´Â º¸Åë È­ÀÏÀ» »ý¼ºÇÑ »ç¿ëÀÚÀÌ´Ù. À¯È¿±×·ì½Äº°¹øÈ£¿Í À¯È¿»ç¿ëÀڽĺ°¹øÈ£ ½ÇÁ¦·Î ÇÁ·Î¼¼½º¸¦ ¼öÇà½ÃŲ »ç¿ëÀÚ ÀÇ »ç¿ëÀÚ ½Äº°¹øÈ£´Â ±× ÇÁ·Î¼¼½ºÀÇ ½Ç»ç¿ëÀڽĺ°¹øÈ£(real user-id)¶ó°í ºÎ ¸£°í, ½ÇÁ¦ »ý¼ºµÈ È­ÀÏ¿¡ ´ëÇÑ ¼ÒÀ¯±ÇÀ» °®´Â »ç¿ëÀÚÀÇ »ç¿ëÀڽĺ°¹øÈ£¸¦ À¯ È¿»ç¿ëÀڽĺ°¹øÈ£¶ó°í ºÎ¸¥´Ù ¹°·Ð ´ëºÎºÐÀÇ °æ¿ì, À¯È¿»ç¿ëÀڽĺ°¹øÈ£¿Í ½Ç»ç ¿ëÀڽĺ°¹øÈ£´Â µ¿ÀÏÇÏ´Ù. 3.1.2. Çã°¡¿Í È­Àϸðµå ´Ù¸¥Á¾·ùÀÇ ¼ÒÀ¯±Ç°ú °°ÀÌ È­ÀÏÀÇ ¼ÒÀ¯±ÇÀº ¼ÒÀ¯ÀÚ¿¡°Ô ¾î¶² ±Ç¸®¸¦ ÁØ´Ù. Ư È÷, ¼ÒÀ¯ÀÚ´Â È­ÀÏ¿¡ °ü·ÃµÈ Çã°¡(permission)¸¦ ¼±ÅÃÇÒ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº »ç¿ëÀÚÀÇ ¼¼°¡Áö À¯ÇüÀÌ Çã°¡¿¡ ÀÇÇØ ¿µÇâÀ» ¹ÞÀ» ¼ö ÀÖ´Ù. 1. È­ÀÏÀÇ ¼ÒÀ¯ÀÚ 2. È­ÀÏÀÇ ¼ÒÀ¯ÀÚ¿Í °°Àº ±×·ì¿¡ ¼ÓÇÏ´Â »ç¿ëÀÚ 3. 1 °ú 2 ÀÇ ¹üÁÖ¿¡ ¼ÓÇÏÁö ¾Ê´Â »ç¿ëÀÚ »ç¿ëÀÚÀÇ °¢ ¹üÁÖ¿¡ ´ëÇØ, È­ÀÏÇã°¡ÀÇ ¼¼°¡Áö ±âº»ÀûÀÎ À¯ÇüÀÌ ÀÖ´Ù. 1. È­ÀÏÀÇ Àбâ 2. È­ÀÏ¿¡ ¾²±â 3. È­ÀÏÀÇ ¼öÇà(È­ÀÏÀÌ ÇÁ·Î±×·¥ ¶Ç´Â ½© ¸í·É¾î ¸®½ºÆ®¸¦ °¡Áö°í ÀÖ´Â °æ¿ì) È­ÀÏ Çã°¡¸¦ Á¤Çϱâ À§ÇÑ ÆÈÁø¼ö °ª -------------------------------------------- ÆÈÁø¼ö °ª ÀÇ ¹Ì -------------------------------------------- 0400 ¼ÒÀ¯ÀÚ¿¡°Ô Àб⸦ Çã°¡ÇÔ 0200 ¼ÒÀ¯ÀÚ¿¡°Ô ¾²±â¸¦ Çã°¡ÇÔ 0100 ¼ÒÀ¯ÀÚ¿¡°Ô È­ÀÏÀÇ ¼öÇàÀ» Çã°¡ÇÔ 0040 ±×·ì¿¡ ´ëÇØ Àб⸦ Çã°¡ÇÔ 0020 ±×·ì¿¡ ´ëÇØ ¾²±â¸¦ Çã°¡ÇÔ 0100 ±×·ì¿¡ ´ëÇØ È­ÀÏÀÇ ¼öÇàÀ» Çã°¡ÇÔ 0004 ´Ù¸¥ ¸ðµç »ç¿ëÀÚ¿¡ ´ëÇØ Àб⸦ Çã°¡ÇÔ 0002 ´Ù¸¥ ¸ðµç »ç¿ëÀÚ¿¡ ´ëÇØ ¾²±â¸¦ Çã°¡ÇÔ 0001 ´Ù¸¥ ¸ðµç »ç¿ëÀÚ¿¡ ´ëÇØ È­ÀÏÀÇ ¼öÇàÀ» Çã°¡ÇÔ -------------------------------------------- 3.1.4. open °ú creat È­ÀÏÀÇ Ãʱâ Çã°¡´Â creat ¶Ç´Â open È£ÃâÀ» ÅëÇؼ­ È­ÀÏÀÌ »ý¼ºµÈ´Ù. filedes = creat("datafile",0644); 3.1.5. access È£Ãâ·Î È­ÀÏ Á¢±Ù °¡´É¼º ÆǺ° ½Ã½ºÅÛ È£Ãâ access ´Â À¯È¿ »ç¿ëÀڽĺ°¹øÈ£°¡ ¾Æ´Ï¶ó ½Ç »ç¿ëÀڽĺ°¹øÈ£¿¡ ÁØÇÏ¿© ÇÁ·Î¼¼½º°¡ È­ÀÏ¿¡ Á¢±ÙÇÒ ¼ö Àִ°¡¸¦ ¾Ë¼ö ÀÖ°Ô ÇÏ´Â À¯¿ëÇÑ ¼ö´ÜÀÌ ´Ù. int result, amode; char *pathname; . . result = access(pathname, amode); access ´Â È­ÀÏ¿¡ ´ëÇÑ Á¢±Ù À¯ÇüÀ» ½Ã½ºÅÛ¿¡ ¾Ë·ÁÁØ´Ù. ÀÌ ÀμöÀÇ °ªÀº ¿ø·¡ ÀÇ È­ÀÏ ¸ðµå¿Í À¯»çÇÑ ´ÙÀ½ÀÇ ÆÈÁø¼ö °ªÀ¸·Î ³ªÅ¸³½´Ù. 04 È£Ãâ ÇÁ·Î¼¼½º°¡ Àбâ Á¢±ÙÀÌ °¡´ÉÇÑ°¡? 02 È£Ãâ ÇÁ·Î¼¼½º°¡ ¾²±â Á¢±ÙÀÌ °¡´ÉÇÑ°¡? 01 È£Ãâ ÇÁ·Î¼¼½º°¡ È­ÀÏÀ» ¼öÇà½Ãų ¼ö Àִ°¡? 3.1.6. chmod ·Î È­ÀÏ Çã°¡ º¯°æ int retval, newmode; char *pathname; . . retval = chmod(pathname, newmode); chmod ½Ã½ºÅÛ È£ÃâÀº Á¸ÀçÇÏ´Â È­ÀÏÀÇ Çã°¡¸¦ º¯°æÇϱâ À§ÇØ »ç¿ëµÈ´Ù. ÀÌ°Í Àº ´ÜÁö È­ÀÏÀÇ ¼ÒÀ¯ÀÚ³ª ¼öÆÛ»ç¿ëÀÚ¸¸ÀÌ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. 3.1.7. chown À¸·Î ¼ÒÀ¯±Ç º¯°æ chown Àº È­ÀÏÀÇ ¼ÒÀ¯ÀÚ¿Í ±×·ìÀ» ÇÔ²² º¯°æÇϱâ À§ÇØ »ç¿ëµÈ´Ù. int retval, owner_id, group_id; char *pathname; . . retval = chown(pathname, owner_id, group_id); 3.1.8. È­ÀÏ»ý¼º ¸¶½ºÅ©¿Í umask ½Ã½ºÅÛ È£Ãâ °¢ ÇÁ·Î¼¼½º¿Í °ü·ÃÇÏ¿© È­ÀÏ»ý¼º(file creation mask)¶ó´Â Á¤¼ö°ªÀÌ Á¸ÀçÇÑ ´Ù. ÀÌ°ÍÀº È­ÀÏÀÌ »ý¼ºµÉ¶§ ¶Ç´Â creat ¶Ç´Â open È£Ãâ·Î È­Àϸðµå°¡ ÁÖ¾îÁú ¶§¸¶´Ù ÀÚµ¿ÀûÀ¸·Î Çã°¡ºñÆ®¸¦ ¸ðµÎ 0 À¸·Î ¸¸µé¾î ÁÖ±â À§ÇØ »ç¿ëµÈ´Ù. ÀÌ°Í Àº ƯÁ¤ÇÑ Çã°¡°¡ ¿ì¿¬È÷ ÁöÁ¤µÇ´Â °ÍÀ» ¹æÁöÇØ Áֱ⠶§¹®¿¡ »ý¼ºµÈ È­ÀÏÀÇ ¾È ÀüÀ» À§Çؼ­ À¯¿ëÇÏ´Ù. ±âº» »ý°¢Àº ´ÙÀ½°ú °°´Ù: ¸¸ÀÏ ÇÑ Çã°¡ºñÆ®°¡ È­ÀÏ »ý ¼º ¸¶½ºÅ©¿¡¼­ ÁöÁ¤µÇ¸é, È­ÀÏÀÌ »ý¼ºµÉ¶§ ±× Çã°¡ºñÆ®¸¦ Ç×»ó 0 À¸·Î ¸¸µé¾î ÁØ´Ù. ´ÙÀ½°ú °°Àº ¹®Àå filedes = creat(pathname, mode); ´Â ½ÇÁ¦ÀûÀ¸·Î ´ÙÀ½ ¹®Àå°ú µ¿ÀÏÇÏ´Ù. filedes = creat(pathname, (~mask)&mode); ¿©±â¼­ mask ´Â È­ÀÏ »ý¼º ¸¶½ºÅ©ÀÇ ÇöÀç°ªÀ» °¡Áö°í, ~ ´Â C ÀÇ ºñÆ®´ÜÀ§ ºÎ Á¤(bitwise negative) ¸í·É¾îÀÌ°í, & ´Â ºñÆ®´ÜÀ§ AND ¸í·É¾îÀÌ´Ù. 3.2. ´ÙÁßÀ̸§À¸·Î µÈ È­ÀÏ UNIX È­ÀÏÀº Çϳª ÀÌ»óÀÇ À̸§À¸·Î ½Äº°µÉ ¼ö ÀÖ´Ù. ´Ù¸¥ ¸»·Î ÇÑ È­ÀÏÀº Áß º¹ÇÏ¿© ¸Þ¸ð¸®¿¡ ÀúÀåµÉ ÇÊ¿ä¾øÀÌ ¿©·¯ UNIX °æ·ÎÀ̸§°ú °ü·ÃµÉ ¼ö ÀÖ´Ù. ±×·¯ ÇÑ °¢ À̸§Àº ¸µÅ©(link)¶ó°í ºÒ¸°´Ù. ÇÑ È­ÀÏ°ú °ü·ÃµÈ ¸µÅ©ÀÇ ¼ö´Â ±× È­ÀÏ ÀÇ ¸µÅ© °è¼ö (link counter)¶ó°í ºÒ¸°´Ù. »õ ¸µÅ©´Â link ½Ã½ºÅÛ È£Ãâ·Î »ý¼º µÈ´Ù. ±×¸®°í Á¸ÀçÇÏ´Â ¸µÅ©´Â unlink ½Ã½ºÅÛ È£Ãâ·Î Á¦°Å µÉ ¼ö ÀÖ´Ù. 3.2.1. ½Ã½ºÅÛ È£Ãâ link int retval; char *path1, *path2; . . retval = link(path1, path2); path1 Àº UNIX °æ·ÎÀ̸§À» °¡¸®Å°´Â ¹®ÀÚÇü Æ÷ÀÎÅÍÀÌ´Ù. ±×°ÍÀº È­ÀÏÀÇ Á¸Àç ÇÏ´Â ¸µÅ©, Áï Á¸ÀçÇÏ´Â À̸§À» ÁöÁ¤ÇØ¾ß ÇÑ´Ù. path2´Â È­ÀÏ¿¡ ´ëÇÑ »õ·Î¿î À̸§ ¶Ç´Â ¸µÅ©¸¦ °¡¸®Å²´Ù. 3.2.2. ½Ã½ºÅÛ È£Ãâ unlink ½Ã½ºÅÛÀ¸·Î ºÎÅÍ È­ÀÏÀ» Á¦°ÅÇÏ´Â °£´ÜÇÑ ¹æ¹ýÀ¸·Î unlink ½Ã½ºÅÛ È£ÃâÀ» ¼Ò °³ÇÑ´Ù. unlink("/tmp/scratch"); ´Â /tmp/scratch ¸¦ Á¦°ÅÇÑ´Ù. »ç½Ç, unlink È£ÃâÀº ´ÜÁö ÇÑ ¸µÅ©¸¦ Á¦°ÅÇÏ °í, È­ÀÏÀÇ ¸µÅ© °è¼ö¸¦ Çϳª ÁÙÀδÙ. ¸µÅ© °è¼ö°¡ 0 ÀÌ µÇ°í, ÇöÀç ±× È­ÀÏÀ» °³¹æÇÏ°í ÀÖ´Â ÇÁ·Î±×·¥ÀÌ ¾ø°Ô µÇ¸é, È­ÀÏÀº ½Ã½ºÅÛÀ¸·Î ºÎÅÍ Á¦°ÅµÈ´Ù. 3.3. È­ÀÏÁ¤º¸È¹µæ : stat ¿Í fstat µÎ ½Ã½ºÅÛ È£Ãâ stat °ú fstat ´Â ÇÁ·Î±×·¥ÀÌ Á¸ÀçÇÏ´Â È­ÀÏÀÇ Æ¯¼ºÀ» ¾Ë¼ö ÀÖµµ·Ï ÇÏ¿© ÁØ´Ù. #include #include int retval, filedes; char *pathname; struct stat buf; . . retval = stat(pathname, &buf); retval = fstat(filedes, &buf); pathname Àº È­ÀÏÀ» ½Äº°ÇÏ´Â °æ·ÎÀ̸§À» °¡¸®Å°°í, &buf ´Â stat ±¸Á¶¸¦ °¡ ¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. ÀÌ stat ±¸Á¶´Â È­ÀÏ¿¡ °ü·ÃµÈ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. struct stat { dev_t st_dev; ino_t st_ino; ushort st_mode; short st_nlink; ushort st_uid; ushort st_gid; dev_t st_rdev; off_t st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; }; stat ±¸Á¶ÀÇ °¢°¢¿¡ ´ëÇÑ Àǹ̴ ´ÙÀ½°ú °°´Ù. 1. st_dev ´Â È­ÀÏÀÌ µé¾îÀÖ´Â ³í¸®Àû ÀåÄ¡(logical device)¸¦ ±â¼úÇÏ°í, st_ino ´Â È­ÀÏÀÇ inode ¹øÈ£¸¦ ³ªÅ¸³½´Ù. 2. st_mode ´Â È­Àϸðµå¸¦ ºÎ¿©ÇÏ°í, ÇÁ·Î±×·¡¸Ó°¡ È­ÀÏ¿¡ °ü·ÃµÈ Çã°¡¸¦ °è »êÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿©ÁØ´Ù. st_mode ¿¡ µé¾îÀÖ´Â °ªÀº È­ÀÏÀÇ À¯Çü¿¡ ´ëÇÑ Á¤º¸·Î¼­, Çã°¡¿¡ °ü·ÃµÈ °ÍÀº ÇÏÀ§ 12 ºñÆ®ÀÌ´Ù. 3. st_nlink ´Â È­ÀÏ¿¡ °ü·ÃµÈ ¸µÅ©ÀÇ ¼ö(´Ù¸¥¸»·Î, ¼­·Î ´Ù¸¥ °æ·ÎÀ̸§ÀÇ ¼ö)¸¦ ºÎ¿©ÇÑ´Ù. ÀÌ °ªÀº link ¿Í unlink È£Ã⠽ø¶´Ù °»½ÅµÈ´Ù. 4. st_uid, st_gid ÀÌ µÎ ±¸Á¶´Â °¢°¢ È­ÀÏÀÇ »ç¿ëÀڽĺ°¹øÈ£¿Í ±×·ì½Äº°¹øÈ£ ¸¦ ³ªÅ¸³½´Ù. ÃʱâÄ¡´Â creat ³ª open È£Ãâ·Î¼­ ÁöÁ¤µÇ°í, chown È£Ãâ·Î¼­ º¯°æµÉ ¼ö ÀÖ´Ù. 5. st_rdev ´Â È­ÀÏ ¿£Æ®¸®°¡ ÀåÄ¡¸¦ ±â¼úÇϴµ¥ »ç¿ëµÉ ¶§¸¸ Àǹ̸¦ °¡Áø´Ù. 6. st_size ´Â È­ÀÏÀÇ ÇöÀç ³í¸®Àû Å©±â·Î¼­ ¹ÙÀÌÆ®¼ö¸¦ ºÎ¿©ÇÑ´Ù. ÀÌ°ÍÀº È­ ÀÏÀÇ ³¡¿¡ ¾²±â¸í·ÉÀÌ ÀÖÀ» ¶§¸¶´Ù º¯°æµÈ´Ù. 7. st_atime ´Â È­ÀÏÀÇ ÀÚ·á°¡ ¸¶Áö¸·À¸·Î ÀÐÇû´ø ½Ã°£À» ±â·ÏÇÑ´Ù. ÃʱâÄ¡·Î creat È£Ãâ½ÃÀÇ ½Ã°£ÀÌ ÁöÁ¤µÈ´Ù. 8. st_mtime ´Â È­ÀÏÀÇ ÀÚ·á°¡ º¯°æµÉ ¶§ÀÇ ½Ã°£À» ±â·ÏÇÑ´Ù. È­ÀÏ¿¡ ¾²±â ¸í ·ÉÀÌ ÀÖÀ»¶§¸¶´Ù º¯°æµÈ´Ù. 9. st_ctime ´Â stat ±¸Á¶ ÀÚü°¡ º¯°æµÉ ¶§ÀÇ ½Ã°£À» ±â·ÏÇÑ´Ù. ÀÌ°ÍÀ» º¯°æ ÇÏ´Â ½Ã½ºÅÛ È£ÃâÀº link(st_nlink ¶§¹®¿¡), chmod(st_mode ¶§¹®¿¡), write(st_mtime °ú st_size ¶§¹®¿¡)µîÀÌ ÀÖ´Ù. 3.3.1. chmod ÀÇ Àç°í chmod ´Â stat ¿Í fstat ¿¡ ÀÇÇؼ­ ´õ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Ù. ¿Ö³ÄÇϸé, ÀÌÁ¦ È­ÀÏÀÇ ¸ðµå¸¦ ¾Ë¼ö ÀÖÀ¸¹Ç·Î ÇÁ·Î±×·¥ÀÌ È­ÀÏÇã°¡¸¦ ¹«Á¶°Ç ´Ù½Ã ÁöÁ¤ÇÏ Áö ¾Ê¾Æµµ µÇ±â ¶§¹®ÀÌ´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 56¹ø Á¦ ¸ñ:[moohou] Unix System Programming 4 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:37 ÀÐÀ½:3708 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 4 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦4Àå µð·¹Å丮, È­ÀϽýºÅÛ, Ư¼ö È­ÀÏ 4.1. °³¿ä µð·ºÅ丮 : µð·ºÅ丮´Â È­ÀÏ À̸§µéÀÇ Ã¢°í¿Í °°´Ù. È­ÀÏ ½Ã½ºÅÛ : È­ÀϽýºÅÛÀº µð·ºÅ丮¿Í È­Àϵé ÀÇ ÁýÇÕÀ¸·Î¼­, UNIX È­Àϱ¸ Á¶¸¦ ±¸¼ºÇÏ´Â µð·ºÅ丮¿Í È­ÀϵéÀÇ °èÃþÀûÀÎ Æ®¸®±¸Á¶ÀÇ ÀϺΠ¸¦ ³ªÅ¸³½´Ù. Ư¼ö È­ÀÏ : UNIX ´Â È­ÀÏÀÇ °³³äÀ» ½Ã½ºÅÛ¿¡ ¿¬°áµÇ¾î ÀÖ´Â ÁÖº¯ÀåÄ¡¿¡±îÁö È®Àå½ÃŲ´Ù. 4.2. µð·ºÅ丮¿Í AT&T ½Ã½ºÅÛ V ÀÎÆ®ÆäÀ̽º Á¤ÀÇ AT&T ÀÇ ½Ã½ºÅÛ V ÀÎÅÍÆäÀ̽º Á¤ÀÇ(SVID)´Â ½ÇÁ¦·Î UNIX µð·ºÅ丮ÀÇ Çü½ÄÀ» Á¤ÀÇÇÏÁö ¾ÊÁö¸¸, µð·ºÅ丮¸¦ ´Ù·ç´Â °ÍÀ» ÀϹÝÈ­Çϱâ À§ÇØ ftw¿Í getcwd ¶ó ºÒ¸®´Â µÎ ¼­ºê·çƾÀ» µµÀÔÇÑ´Ù. ±×·¯³ª UNIX ÀÇ ´Ù¸¥¹öÀü¿¡¼­´Â À̽ÄÀÌ ºÒ°¡ ´ÉÇÏ´Ù. 4.3. µð·ºÅ丮 : »ç¿ëÀÚ °üÁ¡ °¢ »ç¿ëÀÚ´Â º¸Åë ÀÚ½ÅÀÇ È¨ µð·ºÅ丮(home directory)¸¦ °®´Â ´Ù. Ȩ µð·ºÅä ¸®´Â »ç¿ëÀÚ°¡ ·Î±×ÀÎÇÒ¶§ µé¾î°¡´Â Àå¼ÒÀÌ°í, °Å±â¼­ È­ÀÏÀ» »ý¼ºÇϰųª ´Ù·ê ¼ö ÀÖ´Ù. ºÎµð·ºÅ丮´Â ´Ù½Ã ÀÚ½ÅÀÇ ºÎµð·ºÅ丮¸¦ °¡Áú ¼ö ÀÖ°í, ÀÌ·¯ÇÑ °úÁ¤ Àº ¹«ÇÑÈ÷ ¹Ýº¹µÉ ¼ö ÀÖ´Ù. ÇöÀç µð·ºÅ丮 ·Î±×ÀÎÇÑ »ç¿ëÀÚ´Â ÀÚ½ÅÀÌ ÀÛ¾÷Çϱâ À§ÇÑ ÇöÀçÀÛ¾÷ µð·ºÅ丮(current working directory) ¶Ç´Â ÇöÀç µð·ºÅ丮¶ó°í ºÒ¸®´Â È­Àϱ¸Á¶ÀÇ ÇÑ Æ¯Á¤ÇÑ Àå ¼Ò¸¦ °®°Ô µÈ´Ù. $cd /usr/keith $pwd /usr/keith ½Ã½ºÅÛ¿¡ À־ ÇöÀçµð·ºÅ丮´Â È­ÀÏÀÇ »ó´ëÀûÀÎ °æ·ÎÀ̸§(relative path name)À» ãÀ» ¶§ ½ÃÀÛÇÏ´Â µð·ºÅ丮ÀÌ´Ù. $cat book/chap1 Àº $car /usr/keith/book/chap1 °ú µ¿ÀÏÇÏ°í, ¸í·É¾î $cat file1 Àº $cat /usr/keith/file1 °ú µ¿ÀÏÇÏ´Ù. 4.4. µð·ºÅ丮ÀÇ ±¸Çö »ç½Ç, UNIX µð·ºÅ丮´Â ´ÜÁö È­ÀÏ¿¡ ºÒ°úÇÏ´Ù. ±×·¯³ª µð·ºÅ丮¿Í º¸ÅëÀÇ È­ ÀÏ»çÀÌ¿¡´Â ¸î°³ ÀÇ Áß¿äÇÑ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù. µð·ºÅ丮´Â creat ÇÁ¸®¹ÌƼºê¸¦ »ç ¿ëÇؼ­´Â »ý¼ºµÇÁö ¾Ê´Â´Ù. ±¸Á¶ÀûÀ¸·Î ´ëºÎºÐÀÇ UNIX ½Ã½ºÅÛ¿¡¼­ÀÇ µð·ºÅ丮 ´Â 16 ¹ÙÀÌÆ®·Î µÈ Ç׸ñÀÇ ¿­·Î¼­ ±¸¼ºµÈ´Ù. °¢ Ç׸ñÀº µð·ºÅ丮¿¡ Æ÷ÇÔµÈ °¢ È­ÀÏÀ̳ª ºÎ µð·ºÅ丮¿¡ ´ëÀÀÇÑ´Ù. °¢ Ç׸ñÀº µð·ºÅ丮¿¡ Æ÷ÇÔµÈ °¢ È­ÀÏÀ̳ª ºÎ µð·ºÅ丮¿¡ ´ëÀÀÇÑ´Ù. °¢ 16 ¹ÙÀÌÆ®´Â È­ÀÏÀÇ inode ¹øÈ£¶ó°í ºÒ¸®´Â ¾çÀÇ Á¤¼ö°ªÀ» À§ÇÑ 2 ¹ÙÀÌÆ®¿Í È­ÀÏÀ̸§À» ÀúÀåÇÏ´Â 14 ¹ÙÀÌÆ®·Î ±¸¼ºµÈ´Ù. inode ¹øÈ£´Â È­ÀÏÀ» À¯ÀÏÇÏ°Ô ½Äº°ÇÑ´Ù.(½ÇÁ¦ ·Î inode ¹øÈ£´Â È­ÀϽýºÅÛ ³»¿¡¼­ À¯ÀÏÇÏ´Ù.) inode ¹øÈ£´Â inode ±¸Á¶¶ó ºÒ¸®´Â µð½ºÅ© ±âÃÊ ÀڷᱸÁ¶ (disk-based data structure)¸¦ ¸¶·ÃÇϱâ À§ÇØ ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ »ç¿ëµÈ´Ù. ÀÌ ±¸Á¶´Â È­ÀÏ¿¡ ´ëÇÑ ¸ðµç °ü¸® Á¤º¸ Áï, Å©±â, ¼ÒÀ¯ÀÚÀÇ »ç¿ëÀÚ ½Äº°¹øÈ£, ±× ·ì½Äº°¹øÈ£, Çã°¡, »ý¼ºÀÏ, ¸¶Áö¸· º¯°æµÈ ³¯, È­ÀÏ ÀڷḦ °®°í ÀÖ´Â µð½ºÅ© ÀÇ ºí·° ÁÖ¼ÒµîÀ» Æ÷ÇÔÇÑ´Ù. À§ÀÇ µð·ºÅ丮 Ç¥ÇöÀº ÆíÀÇ»ó ³ªÅ¸³½ °ÍÀÌ°í, ½Ç Á¦·Î´Â 2 ¹ÙÀÌÆ®ÀÇ inode ¹øÈ£°¡ ÀÌÁø¼ö ÇüÅ·ΠÀúÀåµÈ´Ù. ÀÌ µÎ ¹ÙÀÌÆ®´Â Á¾ Á¾ Àμ⠺Ұ¡´É ÇÑ °ª(ASC II °ªÀÌ ¾Æ´Ô)À» °¡Áø´Ù. cat ¸í·ÉÀ» »ç¿ëÇÏ¿© µð·º Å丮ÀÇ ³»¿ëÀ» ÇÁ¸°Æ® Çغ¸¸é È­¸é¿¡ ÀÌ»óÇÑ ¹®ÀÚµéÀÌ ³ªÅ¸³­´Ù. µð·ºÅ丮¸¦ Á¶»çÇÏ´Â ÁÁÀº ¹æ¹ýÀº -c ¿É¼ÇÀ» °®´Â 8 Áø¼ö ´ýÇÁ(octal dump) od ¸¦ »ç¿ëÇÏ ´Â °ÍÀÌ´Ù. ÇöÀç µð·ºÅ丮ÀÇ ³»¿ëÀ» º¸±â À§Çؼ­´Â $od -c . ¸¦ ¼öÇàÇØ¾ß ÇÑ´Ù. ÀÌ ¸í·É¿¡¼­ '.' ´Â ÇöÀç µð·ºÅ丮¸¦ ³ªÅ¸³»´Â Ç¥ÁرâÈ£ÀÌ ´Ù. 4.4.1. link ¿Í unlink ÀÇ Àç°íÂû °¢ link ´Â ´ÜÁö »õ·Î¿î È­ÀÏ À̸§¿¡ ¿ø·¡ÀÇ È­ÀÏ À̸§°ú °°Àº inode ¹øÈ£¸¦ °¡Áö´Â »õ·Î¿î µð·ºÅ丮 ½½·Ô(slot)À» ¸¸µé°Ô µÈ´Ù. ¸¸ÀÏ È­ÀÏ abc °¡ »õÀ̸§ xyz ¸¦ °¡Áöµµ·Ï ÇÏ´Â ´ÙÀ½ÀÇ ¸í·É¹® link("abc", "xyz"); ¸¦ ¼öÇàÇÑ´Ù. È­ÀÏÀÌ µð·ºÅ丮·Î ºÎÅÍ Á¦°ÅµÉ¶§ 16 ¹ÙÀÌÆ®ÀÇ µð·ºÅ丮 ½½·ÔÀº ½ÇÁ¦·Î Á¦°Å µÇÁö ¾Ê´Â´Ù. ´ÜÁö inode ¹øÈ£¿¡ È­ÀÏÀÌ Á¦°ÅµÇ¾ú´Ù´Â °ÍÀ» ¾Ë·ÁÁÖ±â À§ÇØ 0 À» ÀúÀåÇÑ´Ù. ¹Ý´ë·Î µð·ºÅ丮¿¡¼­ »õ·Î¿î È­ÀÏÀÌ »ý¼ºµÇ¸é, ½Ã½ºÅÛÀº inode ¹øÈ£¿Í À̸§À» °Å±â¿¡´Ù °ãÃÄ ¾´´Ù. ¸¸ÀÏ ºó ½½·ÔÀÌ ¾øÀ¸¸é È­ÀÏÀÇ À̸§Àº µð ·ºÅ丮ÀÇ ³¡¿¡ ´õÇØÁø´Ù. Áï µð·ºÅ丮 ÀÚü°¡ È®ÀåµÈ´Ù. 4.4.2. Á¡°ú ÀÌÁßÁ¡ '.' °ú '..' Àº ¸ðµç µð·ºÅ丮¿¡ Ç×»ó Á¸ÀçÇÏ´Â È­ÀÏÀÌ´Ù. Á¡Àº ÇöÀç µð·ºÅä ¸®¸¦ °¡¸®Å°´Â Ç¥ÁØ UNIX Ç¥±â¹ýÀ¸·Î¼­, $cat ./fred or $ls . µîÀ¸·Î »ç¿ëÇÑ´Ù. ÀÌÁßÁ¡Àº ÇöÀç µð·ºÅ丮ÀÇ ºÎ¸ð µð·ºÅ丮 Áï, ÇöÀç µð·ºÅä ¸®¸¦ Æ÷ÇÔÇÏ´Â µð·ºÅ丮¸¦ °¡¸®Å°´Â Ç¥ÁØ Ç¥±â¹ýÀÌ´Ù. »ç½Ç '.' °ú '..' Àº ´Ü Áö ÇöÀç µð·ºÅ丮¿Í ºÎ¸ð µð·ºÅ丮¿¡ ´ëÇÑ ¸µÅ©ÀÌ´Ù. 4.4.3. µð·ºÅ丮ÀÇ Çã°¡ º¸ÅëÀÇ È­ÀÏ°ú °°ÀÌ, µð·ºÅ丮µµ ´Ù¸¥ »ç¿ëÀÚÀÇ Á¢±Ù °¡´É¼ºÀ» Á¦¾îÇÏ´Â Á¢±Ù Çã°¡¸¦ °¡Áø´Ù. µð·ºÅ丮 Çã°¡µµ º¸ÅëÀÇ È­ÀÏ Ç㰡ó·³ ¼ÒÀ¯ÀÚ, ±×·ì, ±×¿Ü »ç ¿ëÀÚ¿¡ ´ëÇØ °¢°¢ Á¢±Ù Ư±ÇÀ» ¸í½ÃÇÑ 'rwx' ÀÇ ¼¼ºñÆ®¾¿À¸·Î ±¸¼ºµÈ´Ù. - µð·ºÅ丮¿¡ ´ëÇÑ Àбâ Çã°¡´Â µð·ºÅ丮¿¡ ³»¿¡ ÀÖ´Â È­ÀÏÀ̳ª ºÎµð·ºÅ丮ÀÇ À̸§¿¡ ´ëÇÑ ¸®½ºÆ®¸¦ º¼¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. - µð·ºÅ丮¿¡ ´ëÇÑ ¾²±â Çã°¡´Â »ç¿ëÀÚ°¡ µð·ºÅ丮 ³»ÀÇ È­ÀÏÀ» Á¦°ÅÇϰųª »õ·Î¿î È­ÀÏÀ» ¸¸µé¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. - µð·ºÅ丮¿¡ ´ëÇÑ ¼öÇàÇã°¡(¶Ç´Â Ž»öÇã°¡)´Â cd ¸í·É ¶Ç´Â ÇÁ·Î±×·¥¾ÈÀÇ chdir ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÏ¿© »ç¿ëÀÚ°¡ µð·ºÅ丮 ³»ºÎ·Î µé¾î°¡´Â °ÍÀ» Çã ¿ëÇÑ´Ù. 4.5. µð·ºÅ丮¿Í ÇÁ·Î±×·¡¹Ö Ç¥ÁØ ¿î¿µ üÁ¦ ÇØ´õ È­ÀÏ /usr/include/sys/dir.h ´Â µð·ºÅ丮 Ç׸ñÀÇ ¿ÏÀü ÇÑ Çü½Ä(format)À» Á¤ÀÇÇÑ ÀڷᱸÁ¶¸¦ °®°í ÀÖ´Ù. #define dirsiz 14 struct direct{ ino_t d_ino; char d_name[DIRSIZ]; }; ÀÚ·áÇü ino_t ´Â Çì´õÈ­ÀÏ /usr/include/sys/types.h ¿¡ Á¤ÀǵǾî ÀÖ´Ù. (µû ¶ó¼­, ÀÌ È­ÀÏÀº direct ±¸Á¶¸¦ »ç¿ëÇÏ´Â ¸ðµç ÇÁ·Î±×·¥¿¡ Æ÷ÇԵǾî¾ß ÇÑ´Ù.) ino_t ´Â unsigned short ¿Í µ¿ÀÏÇϱ⠶§¹®¿¡, direct ±¸Á¶ÀÇ ÃÑ Å©±â´Â 16 ¹Ù ÀÌÆ® Áï, µð½ºÅ©ÀÇ µð·ºÅ丮 ½½·ÔÀÇ Å©±â¿Í ÀÏÄ¡ÇÑ´Ù. d_ino Çʵå´Â È­ÀÏ inode ¹øÈ£¸¦ °¡Áö°í, d_name Çʵå´Â È­ÀÏ À̸§À» °¡Áø´Ù. È­ÀÏÀ̸§ÀÌ 14 ÀÚ±î Áö °¡´ÉÇÏ°í 14 ÀÚ°¡ µÇÁö ¾Ê´Â È­ÀÏ À̸§Àº null ·Î ³¡³­´Ù. È­ÀÏ À̸§ÀÌ 14 ÀÚÀÎ °æ¿ì´Â null ·Î ³¡³ªÁö ¾Ê±â ¶§¹®¿¡ d_name Çʵ忡 ´ëÇؼ­´Â C ¶óÀ̺귯 ¸®ÀÇ ¹®ÀÚ¿­ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. 4.5.1. ÇöÀç µð·ºÅ丮 ÇÁ·Î¼¼½ºÀÇ ÃʱâÀÇ ÇöÀç µð·ºÅ丮´Â ÇÁ·Î¼¼½º°¡ ½ÃÀÛÇÑ µð·ºÅ丮·Î ÁöÁ¤µÈ´Ù. ±×·¯³ª chdir À̶ó ºÒ¸®´Â ½Ã½ºÅÛ È£ÃâÀ» ÅëÇؼ­ ÇÁ·Î¼¼½º°¡ µð·ºÅ丮¸¦ º¯°æ ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. 4.5.2. chdir ¿¡ ÀÇÇÑ µð·ºÅ丮 º¯°æ char *path; int retval; retval = chdir(path); chdir ½Ã½ºÅÛ È£ÃâÀº path °¡ È£Ãâ ÇÁ·Î¼¼½ºÀÇ »õ·Î¿î ÇöÀç ÀÛ¾÷ µð·ºÅ丮°¡ µÇ°Ô ÇÑ´Ù. ÀÌ º¯°æÀº ´ÜÁö chdir È£ÃâÀ» ºÎ¸¥ ÇÁ·Î¼¼½º¿¡¸¸ Àû¿ëµÈ´Ù. chdir Àº ½ÇÅÂÇÏ°í -1 À» µ¹·ÁÁØ´Ù. 4.5.3. µð·ºÅ丮 »ý¼º µð·ºÅ丮µéÀ» creat ½Ã½ºÅÛ È£Ãâ·Î´Â »ý¼ºÇÒ ¼ö ¾ø´Ù. ´ë½Å¿¡ Ưº°ÇÑ ½Ã½ºÅÛ È£Ãâ mknod ¸¦ »ç¿ëÇÏ¸é µÈ´Ù. mknod ´Â ¸¹Àº ´Ù¸¥ ±â´ÉÀ» °®°í ÀÖ´Ù. Ư¼ö È­ ÀÏÀ» ¸¸µå´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. ÇÁ·Î¼¼½º°£ÀÇ Åë½Å ä³ÎÀÎ FIFO ¸¦ ¸¸µå´Â µ¥ µµ mknod ¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. mknod ¿¡ ´ëÇÑ Á¢±ÙÀº Á¦ÇѵǾî ÀÖ¾î, ½´ÆÛ»ç¿ë ÀÚ¸¸ÀÌ µð·ºÅ丮¸¦ »ý¼ºÇÏ´Â µ¥ ÀÌ È£ÃâÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. int retval, mode; char *path; retval = mknod(path, mode); µð·ºÅ丮¸¦ »ý¼ºÇÏ°í Á¢±ÙÇã°¡¸¦ ¼³Á¤Çϱâ À§Çؼ­´Â ÆÈÁø¼ö 040000 ¿¡ ¿øÇÏ´Â Á¢±Ù Çã°¡ °ªÀ» mode ¿¡ ÁöÁ¤ÇÏ¸é µÈ´Ù. Çì´õÈ­ÀÏ stat.h ¿¡ ÀÌ °ªÀ» ³ªÅ¸³»´Â »ó¼ö S_IFDIR ÀÌ Á¤ÀǵǾî ÀÖ´Ù. - 040777 ¸ðµç »ç¿ëÀÚ¿¡°Ô Àбâ, ¾²±â, Ž»öÇã°¡¸¦ Çã¿ëÇÏ´Â µð·ºÅ丮¸¦ »ý¼ºÇÑ´Ù. - 040755 ¼ÒÀ¯ÀÚ¿¡°Ô´Â Àбâ, ¾²±â, Ž»ö Çã°¡¸¦ ±×¿ÜÀÇ »ç¿ëÀÚ¿¡°Ô´Â Àбâ¿Í Ž»öÇã°¡ ¸¸À» Çã¿ëÇÏ´Â µð·ºÅ丮¸¦»ý¼ºÇÑ´Ù. Áï, ¼ÒÀ¯ÀÚ¸¸ÀÌ ÀÌ µð ·ºÅ丮¿¡ È­ÀÏÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù. mknod ´Â ¼º°øÇϸé 0 À» ½ÇÆÐÇϸé -1 À» µ¹·ÁÁØ´Ù. »ç¿ëÀÚ°¡ µð·ºÅ丮¸¦ »ý¼º ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº mkdir ¸í·ÉÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. $mkdir dname Àº µð·ºÅ丮 dname À» »ý¼ºÇÑ´Ù. 4.5.4. ·çÆ® µð·ºÅ丮 º¯°æ UNIX È­ÀÏ ½Ã½ºÅÛÀÇ ¸Ç ²À´ë±â´Â ·çÆ® µð·ºÅ丮¶ó ºÒ¸®¸ç '/' ·Î Ç¥±âµÈ´Ù. UNIX ´Â ÇÁ·Î¼¼½º°¡ È­ÀÏ ½Ã½ºÅÛ °èÃþÀÇ Ãâ¹ßÁ¡À» º¯°æÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ½Ã½º ÅÛ È£ÃâÀ» Á¦°øÇÑ´Ù. ÀÌ ½Ã½ºÅÛ È£ÃâÀÌ chroot ÀÌ´Ù. ±×·¯³ª ÀÌ°ÍÀº °ÅÀÇ »ç¿ë µÇÁö ¾Ê´Â´Ù. int retval; char *path; retval = chroot(path); chroot °¡ ¼º°øÇϸé, path ´Â '/' ·Î ½ÃÀÛÇÏ´Â È­ÀÏÀ» Ž»öÇÏ´Â Ãâ¹ßÁ¡ÀÌ µÈ ´Ù. (È£Ãâ ÇÁ·Î¼¼½º¿¡ ´ëÇؼ­¸¸ Àû¿ëµÇ°í, Àü ½Ã½ºÅÛ¿¡´Â ¿µÇâÀ» ³¢Ä¡Áö ¾Ê´Â ´Ù). chroot ´Â ½ÇÆÐÇϸé -1 À» µ¹·ÁÁÖ°í, ·çÆ® µð·ºÅ丮´Â º¯°æµÇÁö ¾Ê´Â´Ù. ÀÌ È£ÃâÀº ½´ÆÛ»ç¿ëÀÚ¸¸ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. 4.5.5. ÇöÀç µð·ºÅ丮ÀÇ À̸§ Ž»ö UNIX ½Ã½ºÅÛ V ´Â ÇöÀç ÀÛ¾÷ µð·ºÅ丮ÀÇ À̸§À» ¾Ë·ÁÁÖ´Â getcwd ¶ó ºÒ¸®´Â ¼­ºê·çƾ(½Ã½ºÅÛ È£ÃâÀÌ ¾Æ´Ô)À» Á¤ÀÇÇÑ´Ù. ½ÇÁ¦·Î´Â pwd ÇÁ·Î±×·¥À» ¼öÇà½ÃÅ´ À¸·Î½á °á°ú¸¦ ¾ò´Â´Ù. int size; char *buf, *ret, *getcwd(); ret = getcwd(buf, size); getcwd ´Â ÇöÀç µð·ºÅ丮 °æ·ÎÀ̸§¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. ÀÌ»óÇÑ ÀÌÀ¯¿¡ ¼­ Àμö size ´Â º¹±ÍµÇ´Â °æ·ÎÀ̸§ÀÇ ±æÀ̺¸´Ù Àû¾îµµ 2 °¡ ´õ Ä¿¾ß ÇÑ´Ù. buf °¡ null Æ÷ÀÎÅÍÀ̸é getcwd ´Â µ¿Àû ¸Þ¸ð¸®¿¡¼­ size°³ ÀÇ ¹ÙÀÌÆ®¸¦ ÇÒ´ç ÇÑ´Ù. getcwd ´Â ½ÇÆÐÇÏ°í null °ªÀ» µ¹·ÁÁØ´Ù. 4.5.6. µð·ºÅ丮 Æ®¸® Ž»ö ¶§¶§·Î µð·ºÅ丮 °èÃþ Æ®¸® »óÀÇ ÁÖ¾îÁø µð·ºÅ丮·Î ºÎÅÍ Ãâ¹ßÇÏ¿© ±× µð·ºÅä ¸®ÀÇ ¾Æ·¡¿¡ ÀÖ´Â ¸ðµç È­ÀÏ°ú ºÎ µð·ºÅ丮¸¦ Ž»öÇÏ´Â ¿¬»êÀÌ ÇÊ¿äÇÑ °æ¿ì°¡ ÀÖ´Ù. #include char *path; int func(); int depth, ret; ret = ftw(path, func, depth); func ´Â »ç¿ëÀÚ°¡ Á¤ÀÇÇÑ ÇÔ¼ö·Î¼­ path ¿¡¼­ Ãâ¹ßÇÏ¿© ¹æ¹®ÇÏ´Â ¸ðµç È­ÀÏ À̳ª µð·ºÅ丮¿¡ ´ëÇØ È£ÃâµÈ´Ù. »ç¿ë¹ý¿¡¼­ º¼¼ö ÀÖµíÀÌ func ´Â ÇÔ¼ö Æ÷ÀÎÅÍ ·Î¼­ ftw ·çƾ¿¡ Àü´ÞµÈ´Ù. ±×·¡¼­ ftw ¸¦ È£ÃâÇϱ⿡ ¾Õ¼­ ÀÌ ÇÔ¼ö¸¦ ¼±¾ðÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. depth Àμö´Â ftw ¿¡ ÀÇÇØ »ç¿ëµÇ´Â ¼­·Î ´Ù¸¥ È­ÀÏ ±â¼ú¾îÀÇ ¼ö ¸¦ Á¶ÀýÇÏ´Â ±â´ÉÀ» ÇÑ´Ù. ÀϹÝÀûÀÎ °æ¿ì¿¡´Â 1 ÀÌ °¡Àå ¾ÈÀüÇÏ´Ù. func ´Â 3 °³ÀÇ Àμö Áï, °´Ã¼(object) À̸§ÀÌ ÀúÀåµÈ null ·Î ³¡³ª´Â ¹®ÀÚ¿­, °´Ã¼¿¡ ´ë ÇÑ ÀÚ·á°¡ ÀúÀåµÈ stat ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ, Á¤¼öÄڵ带 °¡Áö°í È£ÃâµÈ´Ù. int func(name, statptr, type) char *name; struct stat *statptr; int type; { /* body of function */ } Çì´õ È­ÀÏ ftw.h ¿¡ Á¤ÀÇ µÇ¾î ÀÖ´Â °ªÀº FTW_F °´Ã¼°¡ È­ÀÏÀÌ´Ù. FTW_D °´Ã¼°¡ µð·ºÅ丮ÀÌ´Ù. FTW_DNR °´Ã¼°¡ ÀÐÀ» ¼ö ¾ø´Â µð·ºÅ丮ÀÌ´Ù. FTW_NS °´Ã¼°¡ stat ·çƾÀÌ ¼º°øÀûÀ¸·Î ¼öÇàÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù. 4.6. UNIX È­ÀÏ ½Ã½ºÅÛ Áö±Ý±îÁö, È­ÀϵéÀº µð·ºÅ丮¶ó ºÒ¸®´Â ±×·ìµé·Î Æí¼ºµÇ°í, µð·ºÅ丮µéÀº °è ÃþÀû Æ®¸®±¸Á¶ÀÇ ÀϺκÐÀ» Çü¼ºÇÑ´Ù´Â °ÍÀ» »ìÆ캸¾Ò´Ù. µð·ºÅä ¸®µéÀº ±×·ìµÇ ¾î È­ÀÏ ½Ã½ºÅÛÀ̶ó´Â °´Ã¼ (object)¸¦ ÀÌ·é´Ù. È­ÀÏ ½Ã½ºÅÛµéÀº º¸Åë UNIX ½Ã ½ºÅÛÀÇ °ü¸®ÀÚ(administator)¿¡°Ô¸¸ ¿¬°üÀÌ ÀÖ´Ù. ¸ðµç È­ÀÏ ½Ã½ºÅÛµïÀº ºÎÆ® ½ºÆ®·¦±¸¿ª(bootstrap area), È­ÀÏ ½Ã½ºÅÛ ¼öÆÛ ºí·°(file system super block), È­ÀÏ ½Ã½ºÅÛ inode ±¸Á¶¸¦ À§ÇØ ÁغñµÈ ºí·°, ƯÁ¤ È­ÀÏ ½Ã½ºÅÛ¿¡¼­ È­ÀÏÀ» ±¸¼ºÇÏ´Â ÀÚ·á ºí·°µîÀ» À§ÇÑ 4 °³ÀÇ ±¸¿ªÀ¸·Î ±¸¼ºµÈ´Ù. ÀÌ ºí·ÂÀÇ Ã¹ ºÎºÐ(È­ÀÏ ½Ã½ºÅÛ¿¡¼­ ÀÇ ³í¸®Àû ºí·° 0, ±×·¯³ª ¹°¸®ÀûÀ¸·Î´Â µð½ºÅ© ºÐÇÒÀÌ ½ÃÀÛÇÏ´Â Àå¼Ò)Àº ºÎÆ® ½ºÆ®·¦ ºí·°À¸·Î »ç¿ëµÈ´Ù. Áï, ÀÌ ºí·°Àº ½Ã½ºÅÛ ½ÃÀÛ ½Ã°£¿¡ UNIX ¸¦ ·ÎµåÇϱâ À§ÇØ »ç¿ëÇÏ´Â Çϵå¿þ¾î ÁöÁ¤ (hardware-specific) ºÎÆ® ÇÁ·Î±×·¥À» Æ÷ÇÔÇÑ´Ù. 4.6.1. È­ÀÏ ½Ã½ºÅÛ Á¶ÀÛÀ» À§ÇÑ ½Ã½ºÅÛ È£Ãâ UNIX ¿¡´Â È­ÀÏ ½Ã½ºÅÛÀ» ´Ù·ç±â À§ÇÑ 2 °³ÀÇ ±âº»ÀûÀÎ ½Ã½ºÅÛ È£ÃâÀÌ ÀÖ´Ù. mount ´Â »ç¿ëÀÚ°¡ È­ÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ°í unmount ´Â È­ÀÏ ½Ã½ºÅÛÀ» ³»·Á »ç¿ëÀÚ¿¡°Ô º¸ÀÌÁö ¾Êµµ·Ï ÇÑ´Ù. 4.6.2. È­ÀÏ ½Ã½ºÅÛ Å¾Àç : mount char *partition, *dir; int rwflag; mount(partition, dir, rwflag); mount ´Â È­ÀÏÀÌ partition À¸·Î ½Äº°µÇ´Â µð½ºÅ© ºÐÇÒ¿¡ ÀÖ´Â È­ÀÏ ½Ã½ºÅÛ º¼·ýÀ» µð·ºÅ丮 dir ·Î žÀçÇÑ´Ù. º¸Åë partitionÀº /dev/name ÇüÅÂÀÇ À̸§À» °®´Â´Ù(name Àº ´Ù¼Ò ¹Ù²ð¼ö ÀÖ´Ù). /dev ´Â Ư¼öÈ­ÀÏÀÌ ÀúÀåµÈ µð·ºÅ丮 À̸§ ÀÌ´Ù. Ư¼öÈ­ÀÏÀº ÁÖº¯ÀåÄ¡¸¦ À§ÇØ »ç¿ëµÈ´Ù. žÀçµÈÈÄ partition ¿¡ ´ëÇÑ µð ·ºÅ丮 °èÃþÀº µð·ºÅ丮 dir À» ÅëÇØ µµ´ÞÇÒ ¼ö ÀÖ´Ù. Àμö rwflag ÀÇ ÇÏÀ§ºñ Æ®°¡ 1 ·Î ÁöÁ¤µÇ¸é(Áï, rwflag °¡ 1 °ú °°À¸¸é), È­ÀϽýºÅÛÀº Àбâ Çã°¡¸¸ °¡Áö°í žÀçµÈ´Ù. mount ´Â ½´ÆÛ»ç¿ëÀÚ¿¡ ÀÇÇؼ­¸¸ È£ÃâµÉ¼ö ÀÖ°í, ½ÇÆÐÇÑ °æ ¿ì´Â -1 À» ¼º°øÇÑ °æ¿ì´Â 0 À» µ¹·ÁÁØ´Ù. 4.6.3. È­ÀÏ ½Ã½ºÅÛ ³»¸®±â : umount char *partition; umount(partition); umount ´Â µð½ºÅ©ºÐÇÒ partition ¿¡ À§Ä¡ÇÑ ¾Õ¼­ žÀçµÇ¾ú´ø È­ÀϽýºÅÛÀ» µð·ºÅ丮 °èÃþÀ¸·ÎºÎÅÍ Á¦°ÅÇÑ´Ù. ±×·¯¸é ÀÌ È­ÀϽýºÅÛ¿¡ ÀÖ´Â È­ÀÏÀ̳ª µð·º Å丮´Â ÀÌÁ¦ Á¢±ÙÀÌ ºÒ°¡´ÉÇÏ°Ô µÈ´Ù. »ç¿ëÀÚ°¡ È­ÀϽýºÅÛ¿¡ ÀÖ´Â È­ÀÏÀ» »ç ¿ëÇÏ°í ÀÖÀ» ¶§ ¶Ç´Â »ç¿ëÀÚÀÇ ÇöÀç µð·ºÅ丮°¡ È­ÀÏ ½Ã½ºÅÛ¿¡ ÀÖ´Â µð·ºÅ丮 À϶§´Â umount °¡ ½ÇÆи¦ ÇϰԵȴÙ. ij½³°ú sync È£Ãâ È¿À²¼ºÀ» À§Çؼ­, žÀçµÈ È­ÀÏ ½Ã½ºÅÛÀÇ ¼öÆÛ ºí·°ÀÇ º¹»ç°¡ UNIX ±â°èÀåÄ¡ ÀÇ ÁÖ±â¾ïÀåÄ¡¿¡ ÀúÀåµÈ´Ù. UNIX ´Â ¸ðµç ÁÖ±â¾ïÀåÄ¡ÀÇ ¹öÆÛÀÇ ³»¿ëÀ» µð½º Å©·Î º¸³»ÁÖ´Â ½Ã½ºÅÛ È£Ãâ sync ¸¦ Á¦°øÇÑ´Ù. sync(); sync ´Â È­ÀϽýºÅÛÀÇ Æ¯¼öÈ­ÀÏÀ̸§À» ÅëÇØ Àú¼öÁØ(low level)¿¡¼­ È­ÀÏ ½Ã ½ºÅÛÀ» Á¶»çÇÒ ÇÊ¿ä°¡ Àְųª ±â°èÆļտ¡ ´ëºñÇÏ¿© ÀڷẸÁ¸À» ÇØÁÖ´Â ÇÁ·Î ±×·¥¿¡ ÀÇÇØ »ç¿ëµÈ´Ù. È­ÀϽýºÅÛÀÌ ³Ê¹« ¿À·§µ¿¾È °ú°Å³»¿ëÀ» °¡Áö°í ÀÖ °Ô ÇÏÁö¾Ê±â À§Çؼ­ UNIX ´Â ½Ã½ºÅÛÀº ´ÙÁß »ç¿ëÀÚ ¸ðµå¿¡ ÀÖ´Â µ¿¾È ¹Ýº¹ ÇÏ¿© sync ¸¦ È£ÃâÇÏ´Â À¯Æ¿¸®Æ¼ÇÁ·Î±×·¥ update ¸¦ ¼öÇà½ÃŲ´Ù. º¸Åë ÀÌ ±â°£Àº 30 ÃÊ·Î UNIX ½Ã½ºÅÛ V ¿¡¼­´Â ½Ã½ºÅÛ °ü¸®ÀÚ¿¡ ÀÇÇØ Á¶Àý°¡´ÉÇÏ´Ù. 4.6.4. È­ÀÏ ½Ã½ºÅÛ°ú ¹Ì·¡ Ä¿³ÎÀÌ µ¿½Ã¿¡ ¿©·¯ ´Ù¸¥ ¹èÄ¡¸¦ °®´Â È­ÀϽýºÅÛµéÀ» Á¦°øÇØÁÖµµ·Ï ÇÏ´Â È­ ÀϽýºÅÛ ½ºÀ§Ä¡(file system switch)¸¦ µµÀÔÇÏ¿´´Ù.ºÐ»êÈ­ÀϽýºÅÛ(distribu- ted file system)Àº ¿©·¯ ´Ù¸¥ ±â°èÀåÄ¡¿¡ ÀÖ´Â »ç¿ëÀÚµéÀÌ µ¿½Ã¿¡ °°Àº È­ÀÏ ¿¡ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. RFS(Remote File Sharing)´Â ¿ø°Ý±â°èÀåÄ¡ (remote machine)ÀÇ µð·ºÅ丮 °èÃþÀ» ±¹ºÎ ½Ã½ºÅÛ(local system)ÀÇ µð·ºÅ丮¿¡ ¿Ã¸±¼ö ÀÖ°Ô ÇØ ÁØ´Ù. 4.7. UNIX Ư¼ö È­ÀÏ UNIX ½Ã½ºÅÛ¿¡ ºÎÂøµÈ ÁÖº¯ÀåÄ¡(Áï µð½ºÅ©, Å͹̳Î, ÇÁ¸®ÅÍ, Å×ÀÌÇÁ µî)´Â È­ ÀÏ ½Ã½ºÅÛ ³»¿¡¼­ È­ÀÏÀ̸§À¸·Î Ç¥ÇöµÈ´Ù. ÀÌ È­ÀϵéÀ» Ư¼ö È­ÀÏÀ̶ó ÇÑ´Ù. È­ÀÏ ½Ã½ºÅÛ¿¡ ´ëÀÀµÇ´Â µð½ºÅ© ºÐÇÒµµ Ư¼öÈ­ÀϷΠǥÇöµÈ´Ù. ÀÌ Æ¯¼öÈ­ÀϵéÀº º¸Åë µð·ºÅ丮 /dev ¿¡ ÀúÀåµÈ´Ù. /dev/tty00 /dev/tty01 /dev/tty02 ´Â 3 °³ÀÇ ½Ã½ºÅÛ ´Ü¸»±â ÃâÀÔ±¸(port)ÀÇ À̸§ÀÌ´Ù. /dev/lp /dev/rmt0 ´Â ¶óÀÎÇÁ¸°ÅÍ¿Í ÀÚ±âÅ×ÀÌÇÁ¿¡ ´ëÇÑ À̸§ÀÌ´Ù. µð½ºÅ© ºÐÇÒ¿¡ ´ëÇÑ À̸§Àº ´Ù À½°ú °°´Ù. /dev/dk0 /dev/dk1 open, close, read, write ´Â ¸ðµÎ ÇÁ·Î±×·¥³»¿¡¼­ Ư¼ö È­ÀÏ¿¡ »ç¿ëµÉ ¼ö ÀÖ ´Ù. #include main() { int i, fd; fd = open("/dev/tty00", O_WRONLY); for(i = 0; i < 100; i++) write(fd, "x", 1); close(fd); } ´Â 100 °³ÀÇ ¹®ÀÚ x ¸¦ ´Ü¸»±â ÃâÀÔ±¸ tty00¿¡ Ãâ·Â½ÃŲ´Ù. 4.7.1. ºí·°°ú ¹®ÀÚ Æ¯¼öÈ­ÀÏ UNIX Ư¼öÈ­ÀϵéÀº ºí·°ÀåÄ¡(block device)¿Í ¹®ÀÚÀåÄ¡(charater device)·Î ³ª´­¼ö ÀÖ´Ù. 1. ºí·° Ư¼öÈ­ÀϵéÀº µð½ºÅ©³ª ÀÚ±âÅ×ÀÌÇÁ°°Àº ÀåÄ¡¸¦ Æ÷ÇÔÇÑ´Ù. ÀÌ ÀåÄ¡µé °ú Ä¿³Î»çÀÌÀÇ ÀÚ·áÀü¼ÛÀº Ç¥ÁØÅ©±âºí·°(º¸Åë1024¹ÙÀÌÆ®)´ÜÀ§·Î ÀϾ´Ù. ¸ðµç ºí·°ÀåÄ¡´Â ÀÓÀÇÁ¢±ÙÀ» Á¦°øÇÑ´Ù. 2. ¹®ÀÚ Æ¯¼öÈ­ÀϵéÀº ÀÌ·¯ÇÑ ±¸Á¶È­µÈ Àü¼Û±â¹ýÀ» °øÀ¯ÇÏÁö¾Ê´Â ´Ü¸»±â ¶ó ÀÎ, ¸ðµ©¶óÀÎ,ÇÁ¸°Å͵î°ú °°Àº ÀåÄ¡µéÀ» Æ÷ÇÔÇÑ´Ù. ÀÓÀÇÁ¢±ÙÀº Çã¿ëµÉ¼öµµ ¾ÊÀ» ¼öµµ ÀÖ´Ù. È­ÀÏ ½Ã½ºÅÛµéÀº ´ÜÁö ºí·° ÀåÄ¡¿¡¼­¸¸ Á¸ÀçÇÒ ¼ö ÀÖ´Ù´Â °Í¿¡ À¯ÀÇÇ϶ó. UNIX ´Â ƯÁ¤ ÁÖº¯ÀåÄ¡¸¦ ±¸µ¿½ÃÅ°±â À§ÇÏ¿© ºí·°ÀåÄ¡Ç¥¿Í ¹®ÀÚÀåÄ¡Ç¥¸¦ °®°í ÀÖ´Ù. ÁÖº¯ÀåÄ¡¿Í ÀڷḦ ±³È¯ÇÏ´Â ¼ø¼­´Â ´ÙÀ½°ú °°´Ù. 1. ½Ã½ºÅÛ È£Ãâ read ¶Ç´Â write ´Â Á¤»óÀûÀÎ ¹æ¹ýÀ¸·Î Ư¼ö È­ÀÏÀÇ inode ¿¡ Á¢±ÙÇÑ´Ù. 2. ½Ã½ºÅÛÀº ÀåÄ¡°¡ ºí·°ÀåÄ¡ÀÎÁö ¹®ÀÚÀåÄ¡ÀÎÁö¸¦ ¾Ë±âÀ§ÇØ inode ±¸Á¶ÀÇ Çà ·¡±×¸¦ °Ë»çÇÏ¿© ÁÖ¹øÈ£(major number)¸¦ ÃßÃâÇÑ´Ù. 3. ÀåÄ¡ »çȲǥÀÇ ÇØ´çÇ׸ñÀ» ã±â À§ÇØ ÁÖ¹øÈ£¸¦ »ç¿ëÇÏ°í, ÀÚ·á Àü¼ÛÀ» À§ ÇØ ÀåÄ¡ Ư¼º±¸µ¿±â ·çƾÀ» È£ÃâÇÑ´Ù. ÁÖº¯ÀåÄ¡¿¡ ´ëÇÑ Á¢±ÙÀº º¸ÅëÀÇ µð½ºÅ© È­ÀÏ¿¡ ´ëÇÑ Á¢±Ù°ú µ¿ÀÏÇÏ´Ù. 4.7.2. stat ±¸Á¶ÀÇ Àç°íÂû 3 Àå¿¡¼­ ¾ð±ÞÇß´ø stat ±¸Á¶´Â Ư¼öÈ­ÀÏÁ¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ µÎ Çʵ带 °® ´Â´Ù. st_mode : Ư¼öÈ­ÀÏÀÇ °æ¿ì st_mode ´Â È­ÀÏÀÇ Çã°¡¿¡ ºí·°ÀåÄ¡¿¡ ÇØ´çÇÏ´Â 8 Áø¼ö 060000 À̳ª ¹®ÀÚÀåÄ¡¿¡ ÇØ´çÇÏ´Â 020000 À» ´õÇÑ °ªÀ» °® ´Â´Ù. ÀÌ °ª´ë½Å¿¡ stat.h ¿¡¼­ Á¤ÀÇµÈ ±âÈ£»ó¼ö S_IFBLK ¿Í S_IFCHR À» »ç¿ëÇϱ⵵ ÇÑ´Ù. st_rdev : st_rdev ´Â ÁÖÀåÄ¡¹øÈ£µÂ º¸Á¶ ÀåÄ¡¹øÈ£¸¦ °®´Â´Ù. ÀÌ Á¤º¸¸¦ ¾Ë±â À§Çؼ­´Â ls ¸í·É¿¡ -l ¿É¼ÇÀ» ÁÖ¸é µÈ´Ù. ¿¹¸¦ µé¾î, $ls -l /dev/tty3 crw--w--w- 1 ben other 8, 3 Sep 13 10:19 /dev/tty3 °á°úÀÇ Ã¹¹ø° ¿­ÀÇ ¹®ÀÚ 'c' ´Â /dev/tty3 °¡ Ư¼ö È­ÀÏÀ̶ó´Â °ÍÀ» ¾Ë·ÁÁØ ´Ù. Á¤¼ö°ª 8 °ú 3 Àº ÁÖÀåÄ¡¹øÈ£¿Í º¸Á¶ÀåÄ¡¹øÈ£ÀÌ´Ù. ÇÁ·Î±×·¥³»¿¡¼­µµ st_mode ¸¦ Á¶»çÇØ º¼ ¼ö ÀÖ´Ù. if((buf.st_mode & S_IFMT) == S_IFCHR) printf("It's a character device\n "); else printf("It's not\n"); S_IFNT ´Â stat.h ¿¡¼­ Á¤ÀÇµÈ Æ¯¼ö ºñÆ® ¸Å½ºÅ©(special bit mask)ÀÌ´Ù. ustat ´Â °¡¿ëµð½ºÅ© ºí·°ÀÇ ÃÑ °¹¼ö¿Í °¡¿ë inode ÀÇ °¹¼ö¿Í °°Àº ±âº» È­ÀÏ ½Ã½ºÅÛ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. #include #include int dev, ret; struct ustat buf; ret = ustat(dev, & buf); ¿©±â¼­ dev ´Â stat ±¸Á¶ÀÇ st_rdev ·ÎºÎÅÍ ¾Ë¾Æ³½ ÁÖÀåÄ¡¹øÈ£¿Í º¸Á¶ÀåÄ¡ ¹øÈ£¸¦ °®´Â´Ù. Àμö buf ´Â Çì´õÈ­ÀÏ ustat.h ¿¡¼­ Á¤ÀÇµÈ ustat ±¸Á¶ÀÌ´Ù. ustat ±¸Á¶´Â ´ÙÀ½°ú °°´Ù. struct ustat{ daddr_t f_tfree; ino_t f_tinode; char f_fname[6]; char f_fpack[6]; } f_tfree ´Â dev ¿¡ ÀÇÇØ ÁöÁ¤µÈ È­ÀϽýºÅÛ¿¡¼­ÀÇ °¡¿ëµð½ºÅ© ºí·°ÀÇ ÃÑ°¹¼ö ¸¦ ÀúÀåÇÏ°í f_tinode ´Â ÀÌ È­ÀϽýºÅÛ¿¡ ´ëÇÑ °¡¿ë inode ÀÇ °¹¼ö¸¦ ÀúÀåÇÑ ´Ù. f_name °ú f_fpack Àº ½Ã½ºÅÛ °ü¸®ÀÚ°¡ Á¤ÀÇÇÑ È­ÀϽýºÅÛ°ú ÆÑ(pack)À̸§ À» °®´Â´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 57¹ø Á¦ ¸ñ:[moohou] Unix System Programming 5 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:38 ÀÐÀ½:3665 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 5 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦5Àå. ÇÁ·Î¼¼½º 5.1. ÇÁ·Î¼¼½º °³³äÀÇ º¹½À UNIX ¿¡¼­ÀÇ ÇÁ·Î¼¼½º¶õ °£´ÜÈ÷ ¸»ÇÏ¸é ¼öÇàÁßÀÎ ÇÁ·Î±×ÇÜ ±× ÀÚüÀ̸ç, ÀÌ°Í Àº ´Ù¸¥ ȯ°æ¿¡¼­ ¸»Çϴ ŽºÅ©(task) °³³ä¿¡ ÇØ´çÇÑ´Ù. ½©(shell)Àº ÇϳªÀÇ ¸í·ÉÀ» ¼öÇàÇϱâ À§ÇÏ¿© ¾î¶² Æ÷±×·¥À» ½ÃÀÛÇÒ ¶§¸¶´Ù »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »õ¼º ÇÑ´Ù. UNIX ÇÁ·Î¼¼½º ȯ°æÀº È­ÀϽýºÅÛÀÇ µð·ºÅ丮 Æ®¸®¿Í °°Àº °èÃþÀûÀÎ ±¸ Á¶¸¦ °¡Áø´Ù. ÇÁ·Î¼¼½º Æ®¸®ÀÇ ²À´ë±â¿¡´Â ÇϳªÀÇ Á¦¾î ÇÁ·Î¼¼½º°¡ Á¸ÀçÇÏ´Â µ¥, ÀÌ°ÍÀº init ¶ó ÇÏ´Â ¸Å¿ì Áß¿äÇÑ ÇÁ·Î±×·¥ÀÇ ¼öÇàÀ̸ç, ±Ã±ØÀûÀ¸·Î ¸ðµç ÇÁ·Î¼¼½º´Â ÀÌ°ÍÀ¸·Î ºñ·ÔµÈ´Ù. ÇÁ·Î¼¼½º °£ÀÇ Åë½ÅÀ» À§ÇØ Á¦°øµÇ´Â ½Ã½ºÅÛ È£Ãâµé¿¡ ´ëÇؼ­´Â ´ÙÀ½Àå¿¡¼­ ¼³¸íÇϱâ·Î ÇÏ°í, ¿©±â¼­´Â ´ÙÀ½°ú °°Àº ÇÙ½ÉÀû ÀÎ °Í¸¸À» ¼Ò°³ÇÑ´Ù. fork : È£Ãâ ÇÁ·Î¼¼½º¿Í ¶È°°Àº ÇÁ·Î¼¼½º¸¦ Çϳª »ý¼ºÇÑ´Ù. fork ´Â °¡Àå ±âº»ÀûÀÎ ÇÁ·Î¼¼½º »ý¼º ÇÁ¸®¹ÌƼºêÀÌ´Ù. exec : ½Ã½ºÅÛ È£ÃâµéÀÇ ¸ðÀÓÀ¸·Î¼­, °¢°¢Àº µ¿ÀÏÇÑ ±â´É Áï, ÇÑ ÇÁ·Î¼¼½º ¸¦ ±× ÀÚ½ÅÀÇ ±â¾ïÀå¼Ò¿¡ »õ·Î¿î ÇÁ·Î±×·¥À» ´ëÄ¡½ÃÅ´À¸·Î½á º¯È¯½Ã Å°´Â ±â´ÉÀ» ¼öÇàÇÑ´Ù. exec È£Ãâµé °¢°¢ÀÇ Â÷ÀÌ´Â ±×µéÀÇ ¸Å°³º¯¼ö ¸ñ·ÏµéÀÌ ¾î¶²¹æ¹ýÀ¸·Î ÀÛ¼ºµÇ´Â°¡¿¡ ÀÖ´Ù. wait : ÇÁ·Î¼¼½ºÀÇ µ¿±âÈ­(synchronization)¸¦ À§ÇÑ Ãʺ¸ÀûÀΠȣÃâÀÌ´Ù. ÇÁ ·Î¼¼½º¸¦ ¿¬°üµÈ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ³¡³¯¶§±îÁö ±â´Ù¸®°Ô ÇÑ´Ù. exit : ÇÁ·Î¼¼½º¸¦ Á¾·áÇÒ¶§ »ç¿ëµÈ´Ù. 5.2. ÇÁ·Î¼¼½ºÀÇ »ý¼º 5.2.1. fork ½Ã½ºÅÛ È£Ãâ fork ½Ã½ºÅÛ È£ÃâÀº ±âº»ÀûÀÎ ÇÁ·Î¼¼½º »ý¼º ÇÁ¸®¹ÌƼºêÀÌ´Ù. ÀÌ°ÍÀ» ÅëÇÏ¿© UNIX ´Â ´ÙÁßó¸® ½Ã½ºÅÛ(multitasking system)À¸·Î ÀüȯµÈ´Ù. int pid; pid = fork(); fork °¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é Ä¿³ÎÀº È£ÃâÇÏ´Â ÇÁ·Î¼¼½ºÀÇ º¹»çº»À» »õ·Î¿î ÇÁ·Î¼¼½º·Î¼­ »ý¼º ÇÑ´Ù. »õ·Î »ý¼ºµÈ ÇÁ·Î¼¼½º¸¦ ÀÚ½ÄÇÁ·Î¼¼½º(child process)¶ó ÇÏ°í, fork ¸¦ È£ÃâÇÑ ÇÁ·Î¼¼½º¸¦ ºÎ¸ð ÇÁ·Î¼¼½º(parent process) ¶ó ÇÑ´Ù. fork ÀÇ È£Ãâ·Î ÀÚ½ÄÇÁ·Î¼¼½º°¡ »ý¼ºµÈ ÈÄ¿¡´Â ºÎ¸ðÇÁ·Î¼¼½º¿Í ÀÚ½Ä ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ ¼öÇà µÇ¸ç, À̶§ µÎ ÇÁ·Î¼¼½º´Â fork È£Ãâ¹®ÀÇ ¹Ù·Î ´ÙÀ½ ¹®ÀåºÎÅÍ ¼öÇàÀ» °è¼ÓÇÑ´Ù. ÇÁ·Î¼¼½º ½Äº°¹øÈ£ fork ´Â Àμö¾øÀÌ È£ÃâµÇ°í, Á¤¼öÇüÀÇ pid ¸¦ µ¹·ÁÁØ´Ù. pid = fork(); ºÎ¸ð¿Í ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ±¸ºÐÇÏ´Â °ÍÀº pidÀÇ °ªÀÌ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º´Â pid °¡ 0 ÀÌ ¾Æ´Ñ ¾çÀÇ Á¤¼ö °ªÀ» °®´Â ¹Ý¸é ÀÚ½Ä ÇÁ·Î¼¼½º´Â 0 À» °®´Â´Ù. ºÎ¸ð ¿¡°Ô·Î µ¹·ÁÁÖ´Â pid °ªÀ» ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ½Äº°¹øÈ£(process-id)¶ó ÇÑ´Ù. /* spawn -- demonstrate fork */ main() { int pid; /* hold process-id in parent */ printf("Just one process so far\n"); printf("Calling fork ...\n"); pid = fork(); /* create new process*/ if(pid == 0) printf("I'm the child\n"); else if(pid > 0) printf("I'm the parent, child has pid %d\n", pid); else printf("Fork returned error code, no child\n"); } fork µÚÀÇ if ¹®¿¡ 3 °³ÀÇ ºÐ±â(branch)°¡ Á¸ÀçÇÑ´Ù. ù¹ø° ¹®±â´Â º¯¼ö pid °ªÀÌ 0 À϶§, ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ À§ÇÑ µ¿ÀÛÀ» ¸í¼¼ÇÏ´Â °ÍÀÌ°í, µÎ¹ø° ¹®±â ´Â pid °ªÀÌ ¾ç¼öÀ϶§¿¡ ÇØ´çÇÏ´Â °ÍÀ¸·Î, ºÎ¸ð ÇÁ·Î¼¼½º°¡ ÇؾßÇÒ µ¿ÀÛÀ» ³ª Ÿ³½´Ù. ±×¸®°í ¼¼¹ø° ºÐ±â´Â pid °¡ À½¼ö°ª(½ÇÁ¦´Â -1)À» °¡Áú ¶§¿¡ ÇØ´çÇÏ ´Âµ¥, fork °¡ ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ »ý¼ºÀÌ ½ÇÆÐÇÏ¿´À» ¶§ÀÇ µ¿ÀÛÀ» ¸»ÇØÁØ´Ù. ÀÌ ·± »óȲÀº ºÎ¸ðÇÁ·Î¼¼½º°¡ ´ÙÀ½°ú °°Àº µÎÁ¾·ùÀÇ Á¦ÇÑÀ» ±ú¶ß¸®·Á°í ÇßÀ» ¶§ ¹ß»ýÇÑ´Ù. ù°´Â ½Ã½ºÅÛ Â÷¿ø¿¡¼­ Çã¿ëµÇ´Â ÇÁ·Î¼¼½ºÀÇ °¹¼öÀÌ°í, µÑ°´Â °³ º° »ç¿ëÀÚ°¡ µ¿½Ã¿¡ ¼öÇà½Ãų ¼ö ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¼ö¿¡ ´ëÇÑ Á¦ÇÑÀÌ´Ù. ÀÌ·± µÎ Á¾·ùÀÇ »óȲ¿¡¼­ ¿À·ùº¯¼ö errno ´Â EAGAIN À̶ó´Â Äڵ带 °ªÀ¸·Î °¡Áø´Ù. ¿Ö fork °¡ À¯¿ëÇÑ È£ÃâÀΰ¡¸¦ ³íÀÇÇØ º¸ÀÚ. °¡Àå ÇÙ½ÉÀº fork °¡ UNIX ÀÇ ´Ù¸¥ ±â´Éµé°ú ¿¬°üµÉ¶§ ´õ À¯¿ëÇØÁø´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦µé¾î fork ·Î ¸¸µé¾îÁø ºÎ¸ð¿Í ÀÚ½Ä ÇÁ·Î¼¼½º´Â UNIX ¿¡¼­ Á¦°øÇÏ´Â signal À̳ª pipe µî°ú °°Àº ÇÁ·Î ¼¼½º°£ÀÇ Åë½Å±â´ÉÀ» ÀÌ¿ëÇÏ¿© ¼­·Î ÇùÁ¶ÇØ °¡¸é¼­, ¼­·Î °ü·ÃµÇ¾î ÀÖÁö¸¸ ¼­ ·Î ´Ù¸¥ ÀϵéÀ» ÇØ ³ª°¥ ¼ö°¡ ÀÖ´Ù. 5.3. exec ¸¦ ÀÌ¿ëÇÑ »õ ÇÁ·Î±×·¥ÀÇ ¼öÇà 5.3.1. exec ±º exec ±º(family) ¿¡ ¼ÓÇÑ ¾î¶² È£ÃâÀº »õ·Î¿î ÇÁ·Î±×·¥ÀÇ ¼öÇàÀ» À§ÇØ »ç¿ëµÉ ¼ö ÀÖ´Ù. char *path, *file; char *arg0, *arg1, ..., *argn; char *argv[]; int ret; . . ret = execl(path, arg0, arg1, ..., argn, (char *)0); ret = execv(path, argv); ret = execlp(file, arg0, arg1, ..., argn, (char *)0); ret = execvp(file, argv); exec ÀÇ ¸ðµç º¯Á¾µéÀº µ¿ÀÏÇÑ ±â´ÉÀ» ¼öÇàÇÑ´Ù. Áï, È£Ãâ ÇÁ·Î¼¼½º(exec ¸¦ È£ÃâÇÏ´Â)ÀÇ ±â¾ï Àå¼Ò¿¡ »õ·Î¿î ÇÁ·Î±×·¥À» ·Îµå(load)ÇÔÀ¸·Î½á, È£Ãâ ÇÁ·Î¼¼ ½º°¡ »õ ÇÁ·Î±×·¥À» ¼öÇàÇϵµ·Ï ÇÑ´Ù. exec °¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é È£Ãâ ÇÁ·Î ±×·¥Àº ¿ÏÀüÈ÷ »õ·Î¿î ÇÁ·Î±×·¥À¸·Î ´ëÄ¡µÇ°í, ±× ÇÁ·Î±×·¥ÀÇ Ã³À½ºÎÅÍ ¼öÇàÀº ½ÃÀÛÇÏ°Ô µÈ´Ù. °á°ú´Â »õ·Î ¸¸µé¾îÁø ÇÁ·Î¼¼½º Çϳª¸¸ÀÌ Á¸Àç Çϴµ¥, ÀÌ ÇÁ ·Î¼¼½º´Â Àڱ⸦ È£ÃâÇÑ ÇÁ·Î¼¼½º ¿Í ¶È°°Àº ÇÁ·Î¼¼½º½Äº°¹øÈ£¸¦ °¡Áø´Ù. exec ´Â È£Ãâ ÇÁ·Î¼¼½º¿Í µ¿½Ã¿¡ ¼öÇàÇÏ´Â »õ·Î¿î ºÎÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ´Â °ÍÀÌ ¾Æ´Ï ¶ó´Â Á¡ÀÌ Áß¿äÇÏ´Ù. exec ·Î ºÎÅÍÀÇ º¹±Í°ªÀº ¾ø´Ù. excl ÀÇ ¸ðµç Àμö´Â ¹® ÀÚÇüÀÇ Æ÷ÀÎÅÍÀÌ´Ù. ù¹ø° ÀμöÀÎ path ´Â »õ·ÎÀÌ ¼öÇàµÉ ÇÁ·Î±×·¥ÀÌ µé¾îÀÖ ´Â È­ÀÏÀÇ À̸§À» °¡¸®Å²´Ù. ÀÌ°ÍÀº Àý´ë ¶Ç´Â »ó´ëÀûÀÎ À¯È¿ÇÑ °æ·ÎÀ̸§ÀÌ¾î ¾ßÇÑ´Ù. execl(ȤÀº execv)´Â ½©¸í·ÉÀÌ µé¾îÀÖ´Â È­ÀÏÀº ¼öÇà½ÃÅ°Áö ¸øÇÑ´Ù. µÎ¹ø° Àμö arg0 Àº °ü·¹ÀûÀ¸·Î ¾ÕÀÚ¸®ÀÇ °æ·ÎÀ̸§À» Á¦°ÅÇÑ ÇÁ·Î±×·¥ ¶Ç´Â ¸í·ÉÀÇ À̸§ÀÌ µÈ´Ù. ¸¶Áö¸· ÀÓÀ» ¾Ë¸®´Â Ç¥½Ã·Î null Æ÷ÀÎÅÍ°¡ Á¸ÀçÇØ¾ß ÇÑ ´Ù. µð·ºÅ丮¸¦ ³ª¿­ÇÏ´Â ÇÁ·Î±×·¥ ls ¸¦ ¼öÇàÇϱâ À§ÇØ execl À» »ç¿ëÇÏ´Â ´Ù À½ÀÇ ÇÁ·Î±×·¥À» »ìÆ캸ÀÚ. /* runls -- use "execl" to run ls */ main() { printf("executing ls\n"); execl("/bin/ls", "ls", "0l", (char *) 0); /* If execl returns, the call has failed, so ... */ perror("execl failed to run ls"); exit(1); } execl ÀÌ ¼º°øÀûÀ¸·Î È£ÃâµÇ¸é È£Ãâ ÇÁ·Î±×·¥À» Á¦°ÅÇÏ¿© ¼öÇàµÇÁö ¾Ê°Ô ÇÏ °í, execl ÀÌ È£ÃâµÇÁö ¾Ê¾Æ È£Ãâ ÇÁ·Î±×·¥ÀÌ »ì¾Æ ³²À¸¸é ¿À·ù°¡ ¹ß»ýµÇµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î execl °ú ±× º¯Á¾µéÀÌ º¹±ÍµÉ¶§´Â Ç×»ó -1 À» µ¹·Á ÁØ´Ù. execv, execlp ¿Í execvp execv ´Â 2 °³ÀÇ Àμö¸¸À» °¡Áø´Ù. ù°´Â ¼öÇàµÉ ÇÁ·Î±×·¥ÀÇ °æ·ÎÀ̸§À» °¡ Áö°í ÀÖ´Â ¹®ÀÚ¿­À» °¡¸®Å°´Â Æ÷ÀÎÅÍ µÑ°´Â ¹®ÀÚ Æ÷ÀÎÅÍÀÇ ¹è¿­·Î¼­ char *argv[]; ·Î¼­ ¼±¾ðµÇ¾î ÀÖ´Ù. /* runls2 -- use execv to run ls */ main() { char *av[3]; av[0] = "ls"; av[1] = "-l"; av[2] = (char *)0; execv("/bin/ls", av); /* again - getting this far implies error */ perror("execv failed"); exit(1); } execlp ¿Í execvp µµ execl °ú execv ¿Í °ÅÀÇ ºñ½ÁÇÏ´Ù. °¡Àå Áß¿äÇÑ Â÷ÀÌ´Â execlp¿Í execvp ÀÇ Ã¹¹ø° Àμö°¡ °æ·ÎÀ̸§ÀÌ ¾Æ´Ï¶ó ´Ü¼øÈ÷ È­ÀÏÀ̸§À» °¡¸® Ų´Ù´Â µ¥¿¡ ÀÖ´Ù. 5.3.2. exec ¿¡ ÀÇÇØ Àü´ÞµÈ Àμö¿¡ÀÇ Á¢±Ù ¸ðµç ÇÁ·Î±×·¥Àº ÀÚ½ÅÀÇ main ÇÔ¼ö·Î Àü´ÞµÈ Àμö¸¦ ÅëÇؼ­ ÀÚ½ÅÀ» È£ÃâÇÑ exec È£ÃâÀÇ Àμö¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ÀÌ ÀμöµéÀº ÇÁ·Î±×·¥ÀÇ main ÇÔ¼ö¸¦ ´Ù À½°ú °°ÀÌ Á¤ÀÇÇÔÀ¸·Î½á »ç¿ëµÉ ¼ö ÀÖ´Ù. main(argc, argv) int argc; char **argv; { /* body of program */ } argc ´Â ÀμöÀÇ °¹¼ö¸¦ ³ªÅ¸³»´Â Á¤¼öÀÌ°í, argv ´Â ÀμöµéÀÇ ¹è¿­À» °¡¸®Å² ´Ù. ÀÚ½ÅÀÇ Ã¹¹ø° Àμö¸¦ Á¦¿ÜÇÑ ÀμöµéÀ» Ç¥ÁØ Ãâ·ÂÀ¸·Î Ãâ·ÂÇÏ´Â ´ÙÀ½ÀÇ ÇÁ ·Î±×·¥À» »ìÆ캸ÀÚ. /* myecho -- echo command line arguments */ main(argc, argv) int argc; char ** argv; { while(--argc > 0) printf("%s ", *++argv); printf("\n"); } 5.4. exec ¿Í fork ÀÇ °øµ¿ÀÌ¿ë fork ¿Í exec ¸¦ ÇÔ²² »ç¿ëÇÔÀ¸·Î½á ÇÁ·Î±×·¡¸Ó¿¡°Ô ´õ ¸¹Àº ±â´ÉÀ» Á¦°øÇÒ ¼ö ÀÖ´Ù. fork ·Î ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé°í, ±×ÀÚ½ÄÇÁ·Î¼¼½º ¾È¿¡¼­ exec ¸¦ ÀÌ ¿ëÇϸé, ºÎ¸ðÇÁ·Î¼¼½ºÀÇ ÀÔÀå¿¡¼­´Â ÀÚ½ÅÀ» Á×ÀÌÁö ¾Ê°íµµ ÀüÇô ´Ù¸¥ ÇÁ·Î±×·¥ À» ºÎÇÁ·Î¼¼½º·Î °¡Áú ¼ö ÀÖ°Ô µÈ´Ù. °£´ÜÈ÷ ¿À·ù ·çƾ fatal °ú wait ¶ó´Â ½Ã ½ºÅÛ È£ÃâÀÌ »õ·ÎÀÌ ¼Ò°³µÈ´Ù. /* runls3 -- run ls in a subprocess */ main() { int pid; pid = fork(); /* if parent, use wait to suspend * execution until child finishes */ if(pid > 0){ wait((int*)0); printf("ls completed\n"); exit(0); } /* if child then exec ls */ if(pid == 0){ execl("/bin/ls", "ls", "-l", (char *)0); fatal("execl failed"); } /* getting here means pid is * negative, so error has * occurred */ fatal("fork failed"); } fatal Àº ÇÑ ¸Þ¼¼Áö¸¦ Ãâ·ÂÇϱâ À§Çؼ­ ´Ü¼øÈ÷ ±âÁ¸ÀÇ perror ¸¦ È£ÃâÇÑ´Ù. fatal(s) /* print error message and die */ char *s; { perror(s); exit(1); } ÀÌ ¿¹¿¡¼­ wait ´Â fork È£Ãâ·Î ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ Á÷ÈÄ¿¡ È£ÃâµÈ´Ù. ½Ã ½ºÅÛÀº ÀÌ È£Ãâ·Î ÀÎÇØ ÀÚ½ÄÀÌ ³¡³¯¶§±îÁö ºÎ¸ð¸¦ sleep »óÅ¿¡ µÐ´Ù. 5.5. »ó¼ÓµÈ ÀÚ·á¿Í È­ÀÏ ±â¼ú¾î 5.5.1. fork ¿¡ À־ÀÇ È­ÀÏ°ú ÀÚ·á fork ·Î »ý¼ºµÈ ÀÚ½Ä ÇÁ·Î¼¼¼­´Â ºÎ¸ð ÇÁ·Î¼¼½º¿Í °ÅÀÇ ¶È°°´Ù. ƯÈ÷ ºÎ¸ð ÇÁ ·Î¼¼½º°¡ °¡Áö°í ÀÖ´ø º¯¼öÀÇ °ªµéÀº ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ±×´ë·Î Àü´ÞµÈ´Ù. (fork ÀÚ½ÅÀ¸·ÎºÎÅÍÀÇ º¹±Í°ªÀº ¿¹¿ÜÀÓ). ÀڽĿ¡°Ô ÁÖ¾îÁö´Â º¯¼öÀÇ °ªµéÀº ºÎ ¸ð ÇÁ·Î¼¼½º°¡ °¡Áø º¯¼öÀÇ °ªµéÀÇ 'º¹Á¦'À̱⶧¹®¿¡ ±â¾ïÀå¼Ò¿¡¼­ ¼­·Î ´Ù¸¥ À§Ä¡¿¡ ³õÀÌ°Ô µÈ´Ù. ±×·¯³ª fork ÀÌÀü¿¡ °³¹æµÈ È­ÀϵéÀº ºÎ¸ð¿Í ÀÚ½Ä ÇÁ·Î¼¼ ½º°£¿¡ ¸Å¿ì ¹ÐÁ¢ÇÏ°Ô ¿¬°ü µÈ´Ù. ÀÌ°ÍÀº °¢ È­ÀÏÀÇ Àбâ-¾²±â Æ÷ÀÎÅÍ°¡ ºÎ¸ð ¿Í ÀڽĻçÀÌ¿¡¼­ °øÀ¯µÇ±â ¶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ °øÀ¯´Â Àбâ-¾²±â Æ÷ÀÎÅÍ°¡ ÇÁ·Î ±×·¥ ÀÚü³»¿¡ ¸í½ÃÀûÀ¸·Î ¼±¾ðµÇ´Â °ÍÀ̾ƴ϶ó ½Ã½ºÅÛÀÌ °ü¸®ÇÏ´Â °ÍÀ̱⠶§ ¹®¿¡ °¡´ÉÇÏ´Ù. °á·ÐÀûÀ¸·Î ÇÑ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¾î¶² È­ÀÏ¿¡¼­ Á¤¹æÇâÀ¸·Î Æ÷ ÀÎÅ͸¦ ÀüÁø½ÃÅ°¸é ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼­µµ »õ·Î¿î À§Ä¡·Î À̵¿µÈ´Ù. 5.5.2. exec ¿Í °³¹æµÈ È­ÀÏ º¸Åë °³¹æµÈ È­ÀÏ ±â¼ú¾îµéµµ exec ¸¦ È£ÃâÇßÀ» ¶§ »ý¼ºµÈ ÇÁ·Î¼¼½º¿¡ Àü´ÞµÈ ´Ù. Áï, ¿ø·¡ÀÇ ÇÁ·Î±×·¥¿¡¼­ °³¹æµÈ È­ÀϵéÀº exec ¸¦ ÅëÇؼ­ ÀüÇô »õ·Î¿î ÇÁ ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§µµ °³¹æµÈ »óÅ°¡ º¸Á¸µÈ´Ù. ±×·± È­Àϵ鿡 ´ëÇÑ Àбâ-¾²±â Æ÷ÀÎÅ͵鵵 exec È£Ãâ¿¡ ÀÇÇØ º¯È­µÇÁö ¾Ê´Â´Ù. fcntl ·çƾÀ» ÀÌ¿ëÇϸé ÇÑ È­ ÀÏ°ú ¿¬°üµÈ close-on-exec Ç÷¡±×¸¦ Á¶ÀýÇÒ ¼ö ÀÖ´Ù. #include . . int fd; fd = open("file", O_RDONLY); . . /* set close-on-exec flag on */ fcntl(fd, F_SETFD, 1); close-on-exec Ç÷¡±×´Â ¸í·É¹® fcntl(fd, F_SETFD, 0); ¿¡ ÀÇÇØ off ·Î µÈ´Ù. Ç÷¡±×ÀÇ ÇöÀç °ªÀº ´ÙÀ½°ú°°ÀÌ ¾ò¾îÁú ¼ö ÀÖ´Ù. res = fcntl(fd, F_GETFD, 0); Á¤¼öÇü º¯¼ö res ´Â close-exec Ç÷¡±×°¡ È­ÀÏ ±â¼ú¾î fd ¿¡ ´ëÇØ on À϶§ 1 °ªÀ» °¡Áö¸ç, ±×·¸Áö ¾ÊÀ¸¸é 0 À» °¡Áø´Ù. 5.6. exit ½Ã½ºÅÛ È£Ãâ int status; exit(status); exit Àº ÀÌ¹Ì Àͼ÷ÇÑ °ÍÀ¸·Î, ÇÁ·Î¼¼½º¸¦ Á¾·á ½ÃÅ°°íÀÚ ÇÒ¶§ »ç¿ëµÈ´Ù. ¹°·Ð ÇÁ·Î¼¼½º´Â ÇÁ·Î ±×·¥À» ¼öÇàÇϸç main ÇÔ¼öÀÇ ³¡ÀÌ µµ´ÞÇϰųª, main ¿¡¼­ return ¹®À» ¼öÇàÇÒ ¶§¿¡µµ Á¾·áµÈ´Ù. exit È£Ãâ¿¡¼­ °¡Àå Áß¿äÇÑ °ÍÀº ¸ðµç °³¹æµÈ È­ÀÏ ±â¼ú¾î¸¦ ´Ý´Â °ÍÀÌ´Ù. 5.7. wait ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½ºÀÇ µ¿±âÈ­ int retval, status; retval = wait(&status); retval = wait((int *)0); wait ´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¼öÇàµÇ°í ÀÖ´Â µ¿¾È ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ¼öÇàÀ» ÀϽÃÀû À¸·Î ÁߴܽÃŲ´Ù . ÀÚ½ÄÀÌ ¼öÇàÀ» ¸¶Ä¡¸é, ±â´Ù¸®´ø ºÎ¸ð´Â ¼öÇàÀ» Àç°³ÇÑ´Ù. Çϳª ÀÌ»çÀÇ ÀÚ½ÄÀÌ ¼öÇàµÇ°í ÀÖÀ¸¸é, wait ´Â ÀÚ½Ä ÇÁ·Î¼¼½ºµé Áß Çϳª°¡ ÃÖ ÃÊ·Î Á¾·áµÇ´Â ½Ã°£¿¡ º¹±ÍµÈ´Ù. pid = fork(); /* create new process */ if(pid == 0){ /* child */ /* do something..*/ }else{ /* parent, so wait for child */ wait((int *)0); } fork ¿Í wait ÀÇ Á¶ÇÕÀº ÀÚ½Ä ÇÁ·Î¼¼½º°¡ exec¸¦ ÅëÇØ ¿ÏÀüÈ÷ ¼­·Î ´Ù¸¥ ÇÁ·Î ±×·¥À» ¼öÇà Çϵµ·Ï µÇ¾îÀÖÀ» ¶§ ÀÌ¿ëµÈ´Ù. wait °¡ -1 À» µ¹·ÁÁÖ¸é »ì¾ÆÀÖ´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¾ø´Ù´Â ÀǹÌÀÌ°í, ÀÌ °æ¿ì errno ´Â ¿À·ù ÄÚµå ECHILD ¸¦ °¡ Áö°Ô µÈ´Ù. 5.8. Á»ºñ¿Í ºÒ¿ÏÀüÇÑ Á¾·á 1. ºÎ¸ð ÇÁ·Î¼¼½º°¡ wait ¸¦ ¼öÇàÇÏÁö ¾Ê°í ÀÖ´Â »óÅ¿¡¼­ ÀÚ½ÄÀÌ Á¾·áÇÒ¶§ 2. Çϳª ÀÌ»óÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¼öÇàµÇ°í ÀÖ´Â »óÅ¿¡¼­ ºÎ¸ð°¡ Á¾·áÇÒ¶§ 1 ÀÇ °æ¿ì Á¾·áÇÏ´Â ÇÁ·Î¼¼½º´Â ÀÏÁ¾ÀÇ ÀØÇôÁø Àå¼Ò·Î ¿Å°ÜÁ®¼­ Á»ºñ(zombie) °¡ µÈ´Ù. Á»ºñ ÇÁ·Î¼¼½º´Â ÇÁ·Î¼¼½º¸¦ Á¦¾îÇϱâ À§ÇØ Ä¿³ÎÀÌ °ü¸®ÇÏ°í ÀÖ´Â Å× ÀÌºí¿¡ µî·ÏµÇ¾î ÀÖÀ¸¸é¼­ Ä¿³ÎÀÇ ´Ù¸¥ ÀÚ¿øµéÀº »ç¿ëÇÏÁö ¾Ê´Â´Ù. 2 ÀÇ °æ¿ì, ºÎ¸ð´Â Á¤»óÀûÀÎ Á¾·á°¡ Çã¿ëµÈ´Ù. ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ Àڽĵé(Á»ºñ ¸¦ Æ÷ÇÔÇÑ)Àº ½Ã½º ÅÛÀÇ ÃʱâÈ­ ÇÁ·Î¼¼½º¿¡°Ô ¸Ã°ÜÁø´Ù(ÃʱâÈ­ ÇÁ·Î¼¼½º°¡ ºÎ ¸ðÀÇ ¿ªÈ°À» ÇÔ). 5.9. smallsh : ¸í·É¾î 󸮱â -- »ý·« 5.10. ÇÁ·Î¼¼½º ¼Ó¼º °¢°¢ÀÇ UNIX ÇÁ·Î¼¼½º´Â ¸î°¡ÁöÀÇ ¼Ó¼Û(attribute)µéÀ» °¡Áö´Âµ¥, ÀÌ ¼Ó¼ºÀº ÇÁ·Î¼¼½ºÀÇ ¼öÇà°ú ¼öÇà°èȹ(scheduling), È­ÀÏ ½Ã½ºÅÛÀÇ º¸¾È À¯ÁöµîÀ» ½Ã½º ÅÛÀÌ Á¶Á¤Çϴµ¥¿¡ µµ¿òÀ» ÁØ´Ù. 5.10.1. ÇÁ·Î¼¼½º ½Äº°¹øÈ£ ½Ã½ºÅÛÀº °¢ ÇÁ·Î¼¼½º¿¡°Ô ÇÁ·Î¼¼½º ½Äº°¹øÈ£¶ó´Â À½ÀÌ ¾Æ´Ñ Á¤¼ö¸¦ ºÎ¿©ÇÑ ´Ù. ÇÁ·Î¼¼½º ½Äº°¹øÈ£´Â ÇØ´ç ÇÁ·Î¼¼½º°¡ Á¾·áÇÏ¸é ´Ù½Ã »ç¿ëµÉ ¼ö ÀÖÁö¸¸, ÇÑ ½ÃÁ¡¿¡¼­´Â À¯ÀÏÇÏ°Ô ÇÁ·Î¼¼½º¸¦ ÁöÁ¤ÇÑ´Ù. ÇÁ·Î¼¼½º 0 Àº ¼öÇà °èȹ ÇÁ·Î ¼¼½º(scheduler) ÀÌ°í, ÇÁ·Î¼¼½º 1 Àº /etc/init ÇÁ·Î±×·¥À» ¼öÇàÇÏ°í ÀÖ´Â ÃÊ ±âÈ­ ÇÁ·Î¼¼½ºÀÌ´Ù. ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ÀÚ½ÅÀÇ ÇÁ·Î¼¼½º ½Äº° ¹øÈ£¸¦ Âü Á¶ÇÒ ¼ö ÀÖ´Ù. pid = getpid(); getppid ¸¦ »ç¿ëÇϸé È£Ãâ ÇÁ·Î¼¼½ºÀÇ ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º½Äº°¹øÈ£¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ppid = getppid(); 5.10.2. ÇÁ·Î¼¼½º ±×·ì°ú ÇÁ·Î¼¼½º ±×·ì½Äº°¹øÈ£ UNIX ´Â ÇÁ·Î¼¼½ºµéÀÌ ¾î¶² ±×·ì¿¡ ¼ÓÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù. °¢ ÇÁ·Î¼¼½º ±×·ì Àº ÇÁ·Î¼¼½º ±×·ì½Äº°¹øÈ£¶ó ºÒ¸®´Â Á¤¼ö·Î Ç¥½ÃµÈ´Ù. óÀ½¿¡ ÇÁ·Î¼¼½º´Â fork ³ª exec ¸¦ È£ÃâÇÒ ¶§ ÀÚ½ÅÀÇ ÇÁ·Î¼¼½º ±×·ì½Äº°¹øÈ£¸¦ »õ·Î¿î ÇÁ·Î¼¼½º¿¡°Ô·Î »ó¼ÓÇÑ´Ù. ±×·¯³ª ÇÑ ÇÁ·Î¼¼½º´Â setpgrp ¸¦ È£ÃâÇÔÀ¸·Î½á ÀÚ½ÅÀ» »õ·Î¿î ±×·ì ¿¡ ³ÖÀ» ¼ö ÀÖ´Ù. newpg = setpgrp(); newpg ´Â »õ·Î¿î ÇÁ·Î¼¼½º ±×·ì½Äº°¹øÈ£Àε¥, ½ÇÀº È£Ãâ ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ½Äº°¹øÈ£¿Í µ¿ÀÏÇÑ °ªÀÌ´Ù. ÇÑ ÇÁ·Î¼¼½º´Â ÀÚ½ÅÀÇ ÇöÀç ÇÁ·Î¼¼½º ±×·ì½Äº° ¹ø È£¸¦ getpgrp ¶ó´Â ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ¾òÀ» ¼ö ÀÖ´Ù. pgid = getpgrp(); ÀÚ½ÅÀÇ ÇÁ·Î¼¼½º ±×·ì½Äº°¹øÈ£¸¦ ¼öÁ¤ÇÏÁö ¾ÊÀº ÇÁ·Î±×·¥À̶ó¸é, pgid ÀÇ °ª Àº ÀÚ½ÅÀÇ Á¶»óÁßÀÇ ½© ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º½Äº°¹øÈ£°¡ µÉ °ÍÀÌ´Ù. 5.10.3. ȯ°æ ÇÁ·Î¼¼½ºÀÇ È¯°æ(environment)Àº °£´ÜÈ÷ ¸»Çϸé null ·Î ³¡³ª´Â ¹®ÀÚ¿­ÀÇ ¸ð ÀÓÀε¥, ÇÁ·Î±×·¥ ¾È¿¡¼­´Â ¹®ÀÚÇü Æ÷ÀÎÅÍÀÇ null ·Î ³¡³ª´Â ¹è¿­ ·Î Ç¥ÇöµÈ ´Ù. °ü·¹ÀûÀ¸·Î, °¢ ȯ°æ ¹®ÀÚ¿­Àº ´ÙÀ½°ú °°Àº ÇüŸ¦ °¡Áø´Ù. name = something ÇÁ·Î±×·¡¸Ó´Â ÇÁ·Î±×·¥ÀÇ main ÇÔ¼öÀÇ Àμö ¸®½ºÆ®¿¡ envp ¶ó´Â ¶Ç ÇϳªÀÇ ÀÎ ¼ö¸¦ ÷°¡ÇÔÀ¸·Î½á, ÇÁ·Î¼¼½ºÀÇ È¯°æÀ» Á÷Á¢»ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ÇÁ·Î±×·¥ Àº envp ÀÇ À¯ÇüÀ» º¸¿©ÁØ´Ù. main(argc, argv, envp) int argc; char **argv, **envp; { /* do something */ } 5.10.4. ÇöÀç ÀÛ¾÷ µð·ºÅ丮 ¾ÕÀÇ 4 Àå¿¡¼­ »ìÆ캸¾ÒµíÀÌ, °¢ ÇÁ·Î¼¼½º´Â ÇöÀç ÀÛ¾÷ µð·ºÅ丮¿Í ¿¬°üµÈ´Ù. ÇöÀç µð·ºÅ丮 ÀÇ Ãʱâ»óÅ´ ±× ÇÁ·Î¼¼½º°¡ fork ³ª exec ·Î ½ÃÀÛµÉ ¶§ ¹°·Á ¹Þ´Â´Ù. ´Ù½Ã ¸»Çϸé ÇÑ ÇÁ·Î¼¼½º´Â ±×ÀÇ ºÎ¸ð¿Í °°Àº µð·ºÅ丮¿¡ ³õ¿©Áø´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º°¡ chdir À» È£ÃâÇÔÀ¸·Î½á, ±× À§Ä¡¸¦ º¯È­½ÃÄѵµ ºÎ¸ð ÇÁ·Î¼¼½º ÀÇ ÇöÀç µð·ºÅ丮´Â º¯ÇÏÁö ¾Ê´Â´Ù. ÀÌ·± ÀÌÀ¯·Î Ç¥ÁØ cd ¸í·É¾î´Â ½© ÀÚü¿¡ ³»ÀåµÈ ¸í·É¾îÀÌ°í, ÇÁ·Î±×·¥¿¡ ´ëÀÀÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù. 5.10.5. »ç¿ëÀÚ ½Äº°¹øÈ£¿Í ±×·ì½Äº°¹øÈ£ °¢ ÇÁ·Î¼¼½º´Â ½ÇÁ¦ »ç¿ëÀڽĺ°¹øÈ£¿Í ±×·ì½Äº°¹øÈ£¿Íµµ ¿¬°üµÈ´Ù. À̰͵éÀº ±× ÇÁ·Î¼¼½º¸¦ È£ÃâÇÑ ½ÇÁ¦ »ç¿ëÀÚ¿Í, ±× »ç¿ëÀÚ°¡ ¼ÓÇÑ ±×·ìÀÇ ½Äº°¹øÈ£µéÀÌ ´Ù. ´õ Áß¿äÇÑ °ÍÀº À¯È¿ »ç¿ëÀڽĺ°¹øÈ£¿Í À¯È¿±×·ì½Äº°¹øÈ£Àε¥, À̰͵éÀº ¾î¶² »ç¿ëÀÚ°¡ ÇÑ È­ÀÏÀ» Á¢±ÙÇÒ ¼ö ÀÖ´Â ÁöÀÇ ¿©ºÎ¸¦ °áÁ¤Çϴµ¥ »ç¿ëµÈ´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡ À¯È¿»ç¿ëÀÚ ½Äº° ¹øÈ£¿Í ½ÇÁ¦»ç¿ëÀÚ ½Äº°¹øÈ£´Â °°´Ù. ÇÁ·Î½º ·¦ È­ÀÏÀÇ set-user-id ºñÆ®°¡ 1 À̸é, ±× ÇÁ·Î±×·¥ÀÌ exec ·Î È£ÃâµÉ ¶§, ±× ÇÁ·Î¼¼½º ÀÇ À¯È¿ »ç¿ëÀڽĺ°¹øÈ£´Â ±× ÇÁ·Î¼¼½º¸¦ ½ÃÀÛ½ÃŲ ½ÇÁ¦»ç¿ëÀÚ°¡ ¾Æ ´Ï¶ó. ÇÁ·Î±×·¥ È­ÀÏÀÇ ¼ÒÀ¯ÀÚ°¡ µÈ´Ù. ÇÁ·Î¼¼½º¿Í ¿¬°üµÈ »ç¿ëÀÚ¿Í ±×·ìÀÇ ½Ä º°¹øÈ£¸¦ ¾ò´Âµ¥ ¾²ÀÌ´Â ½Ã½ºÅÛÈ£ÃâÀÌ ¸î°¡Áö ÀÖ´Ù. int uid, euid, gid, egid; /* get real user-id */ uid = getuid(); /* get effective user-id */ euid = geteuid(); /* get real group-id */ gid = getgid(); /* get effective group-id */ egid = getegid(); À¯È¿»ç¿ëÀÚ¿Í ±×·ìÀÇ ½Äº°¹øÈ£¸¦ ÁöÁ¤ÇÒ ¶§¿¡´Â ´ÙÀ½ÀÇ µÎ°¡Áö È£ÃâÀÌ À¯¿ëÇÏ ´Ù. int status, newuid, newgid; . . /* set effective user-id */ status = setuid(newuid); /* set effective group-id */ status = setgid(newgid); µÎ ·çƾÀÇ º¹±Í°ªÀÌ 0 ÀÌ¸é ¼öÇàÀÇ ¼º°øÀ», 1 ÀÌ¸é ½ÇÆи¦ ³ªÅ¸³½´Ù. 5.10.6. È­ÀÏÅ©±âÀÇ Á¦ÇÑ : ulimit ½Ã½ºÅÛ V ¿¡´Â ÇÁ·Î¼¼½º¸¶´Ù wait ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ¸¸µé ¼ö ÀÖ´Â È­ÀÏ ÀÇ Å©±â¿¡ Á¦ÇÑÀÌ ÀÖ´Ù. È­ÀÏ Å©±âÀÇ Á¦ÇÑÀº ulimit ¶ó´Â ½Ã½ºÅÛ È£Ãâ·Î Á¶ÀÛ µÈ´Ù. long retval, newlimit, ulimit(); int cmd; . . retval = ulimit(cmd, newlimit); ÇöÀç È­ÀÏÀÇ Å©±â Á¦ÇÑÀ» ¾ò¾î³»±â À§ÇÏ¿© ÇÁ·Î±×·¡¸Ó´Â cmd Àμö¸¦ 1 ·Î ÇÏ °í ulimit ¸¦ È£ÃâÇÑ´Ù. º¹±Í°ªÀÎ retval Àº 512 ¹ÙÀÌÆ®¸¦ ÇÑ ºí·°À¸·Î ÇÏ´Â ´ÜÀ§ÀÌ´Ù. È­ÀÏ Å©±âÀÇ Á¦ÇÑÀ» ¹Ù²Ù·Á¸é cmd ¸¦ 2 ·Î ÇÏ°í, È­ÀÏÀÇ Å©±â¿¡ ´ë ÇÑ »õ·Î¿î Á¦ÇÑÀ» 512 ¹ÙÀÌÆ® ºí·°À» ´ÜÀ§·Î newlimit ¿¡ ÀúÀåÇÑ´Ù. 5.10.7. ÇÁ·Î¼¼½º ¿ì¼± ¼øÀ§ : nice ½Ã½ºÅÛÀÌ cpu ½Ã°£ÀÇ ºñÀ²À» °áÁ¤ÇÒ ¶§, ƯÁ¤ÇÑ ÇÁ·Î¼¼½º´Â ±×ÀÇ nice °ª(Á¤ ¼ö)¿¡ ÀÇ°ÅÇÏ¿© ½Ã°£ÀÌ ÇÒ´çµÈ´Ù. Nice °ªÀº 0 ¿¡¼­ ½Ã½ºÅÛÀÌ Á¤ÇÏ´Â ÃÖ´ë°ª (º¸ÅëÀº 39)±îÁöÀÌ´Ù. Å« °ªÀ» °¡Áú¼ö·Ï ÇÁ·Î¼¼½º´Â ³·Àº ¿ì¼±¼øÀ§¸¦ °¡Áø´Ù. nice È£ÃâÀº ÇϳªÀÇ Àμö¸¦ ÇÊ¿ä·Î Çϴµ¥, ±×°ÍÀº ÇöÀçÀÇ nice °ª¿¡´Ù Áõ°¡½Ã Å°·Á´Â ¸¸Å­ÀÇ ¾çÀÇ Á¤¼ö°ª, Áï Áõ°¡ºÐÀ» ¸»ÇÑ´Ù. nice(5); ¼öÆÛ »ç¿ëÀÚ¸¸ÀÌ Àμö¸¦ À½¼ö·ÎÇÏ¿© ¿ì¼±¼øÀ§¸¦ ³ôÀϼö°¡ ÀÖ´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 58¹ø Á¦ ¸ñ:[moohou] Unix System Programming 6 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:39 ÀÐÀ½:3521 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 6 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦6Àå. ÇÁ·Î¼¼½º°£ÀÇ Åë½Å : 1 6.1. ¼­·Ð ¼ÒÇÁÆ®¿þ¾î ½Ã½ºÅÛÀ» ±¸¼ºÇÒ¶§ ÇϳªÀÇ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó ¿©·¯ °³ÀÇ »óÈ£º¸Á¶ ÀûÀÎ ÇÁ·Î¼¼½º¸¦ ÀÌ¿ëÇØ¾ß ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. µÎ °³ ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ÀÛ¾÷À» °øµ¿À¸·Î ¼öÇàÇÏ·Á¸é ÀڷḦ °øÀ¯ÇØ¾ß ÇÑ´Ù. À̸¦ À§ÇÑ ÇÑ°¡Áö ¹æ¹ýÀº È­ÀÏÀ» °øÀ¯ÇÏ´Â °ÍÀÌ´Ù. UNIX ¿¡´Â ´Ù¾çÇÑ ÇÁ·Î¼¼½º°£ Åë½Å¹æ½ÄÀÌ Á¸ÀçÇÑ´Ù. ÀÌÀå¿¡¼­´Â °¡Àå ¸¹ÀÌ ¾²ÀÌ´Â ¼¼°¡Áö ¹æ¹ýÀÎ ½Ã±×³Î, ÆÄÀÌÇÁ, FIFO ¸¦ ¼Ò°³ÇÑ ´Ù. 6.2. ½Ã±×³Î 6.2.1. °³°ü ½Ã±×³ÎÀ» ÀÌ¿ëÇϸé UNIX ÇÁ·Î¼¼½º¿¡ ¼ÒÇÁÆ®¿þ¾î ÀÎÆ®·´Æ®¸¦ °£´ÜÈ÷ Àü¼ÛÇÒ ¼ö ÀÖ´Ù. Ư¼º»óÀ¸·Î º¼¶§ ½Ã±×³ÎÀº ÇÁ·Î¼¼½º°£¿¡ ÀڷḦ Àü¼ÛÇϴµ¥ º¸´Ù´Â ºñÁ¤ »óÀûÀÎ »óȲÀ» ó¸®Çϴµ¥ ´õ¿í ÀûÇÕÇÏ´Ù. ½Ã±×³Î À̸§ ½Ã±×³Î À̸§µéÀº #define ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© Ç¥ÁØÇì´õÈ­ÀÏÀÎ signal.h ¿¡ Á¤ÀÇ µÇ¾î ÀÖ´Ù. UNIX ¿¡¼­ Á¦°øµÇ´Â ½Ã±×³ÎµéÀº ¸î°³¸¦ Á¦¿ÜÇÏ°í´Â ´ëºÎºÐ Ä¿³Î ¿¡ ÀÇÇØ »ç¿ëµÈ´Ù. SIGHUP : hangup ½Ã±×³Î. ÀÌ ½Ã±×³ÎÀº Á¦¾î´Ü¸»±âÀÇ ¿¬°áÀÌ ²÷¾îÁ³À» ¶§ Ä¿ ³Î¿¡ ÀÇÇÏ¿© ±× ´Ü¸»±â¿¡ ¿¬°áµÈ ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. SIGINT : interrupt. ÀÌ ½Ã±×³ÎÀº »ç¿ëÀÚ°¡ ÀÎÅÍ·´Æ®Å°¸¦ Ä¥ ¶§ Ä¿³Î¿¡ ÀÇ ÇÏ¿© ´Ü¸»±â¿Í ¿¬°áµÈ ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. ÀÌ°ÍÀº ¼öÇàÁß ÀÎ ÇÁ·Î±×·¥À» ÁßÁö½ÃÅ°´Â ÀϹÝÀûÀÎ ¹æ¹ýÀÌ´Ù. SIGQUIT : quit. ÀÌ ½Ã±×³ÎÀº SIGINT ¿Í ¸¶Âù°¡Áö·Î »ç¿ëÀÚ°¡ ´Ü¸»±â¿¡¼­ Á¾·á(quit)Å°¸¦ Ä¥¶§ Ä¿³Î¿¡ ÀÇÇÏ¿© º¸³»Áø´Ù. Á¾·áÅ°ÀÇ ÀϹÝÀûÀÎ °ªÀº ASCII FS ¶Ç´Â CTRL-\ ÀÌ´Ù. SIGILL : illegal Instruction. ÀÌ ½Ã±×³ÎÀº ºñÁ¤»óÀûÀÎ ¸í·ÉÀÌ ¼öÇàµÇ·Á ÇÒ ¶§ ¿î¿µÃ¼Á¦·ÎºÎÅÍ º¸³»Áø´Ù. SIGTRAP : trace trap. ÀÌ°ÍÀº ptrace ½Ã½ºÅÛ°ú ÇÔ²² sdb µÂ adb µîÀÇ µð¹ö °Å¿¡ ÀÇÇÏ¿© »ç¿ëµÇ´Â Ưº°ÇÑ ½Ã±×³ÎÀÌ´Ù. SIGFPE : floating-point exception. ÀÌ°ÍÀº ¿À¹öÇ÷ο쳪 ¾ð´õÇÆ·Î¿ì °°Àº ºÎµ¿ ¼Ò¼ýÁ¡ ¿À·ù°¡ ¹ß»ýÇßÀ» ¶§ Ä¿³Î¿¡ ÀÇÇÏ¿© º¸³»Áø´Ù. SIGKILL : kill. ÀÌ°ÍÀº ÇÁ·Î¼¼½º·ÎºÎÅÍ ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃÅ°±â À§ÇÏ ¿© º¸³»Áö´Â Á¶±Ý Ưº°ÇÑ ½Ã±×³ÎÀÌ´Ù. SIGSYS : bad arguments to a system call. ÀÌ°ÍÀº ÇÁ·Î¼¼½º°¡ Á¤»óÀûÀÎ ½Ã ½ºÅÛ È£Ãâ ¿À·ù º¹±¸ ¹æ½Ä¿¡ ÀÇÇÏ¿© ó¸®µÉ ¼ö ¾ø´Â ºÎÀûÀýÇÑ ÀÎ ¼ö¸¦ ½Ã½ºÅÛ È£Ãâ¿¡ º¸³ÂÀ» ¶§ Ä¿³Î¿¡ ÀÇÇÏ¿© º¸³»Áø´Ù. SIGPIPE : write on a pipe with no-one to read it. ÆÄÀÌÇÁ´Â 6.3.Àý¿¡¼­ ´Ù·ç¾îÁú ¶Ç ÇϳªÀÇ ÇÁ·Î¼¼½º°£ Åë½Å ¹æ½ÄÀÌ´Ù. SIGALRM : alarm clock. ÀÌ°ÍÀº ŸÀ̸Ӱ¡ ¸¸·áµÇ¾úÀ» ¶§ Ä¿³Î¿¡ÀÇÇÏ¿© ÇÁ·Î ¼¼½º¿¡ º¸³»Áø´Ù. SIGTERM : software termination. ÀÌ ½Ã±×³ÎÀº º¸ÅëÀÇ ÇÁ·Î±×·¥¿¡ ÀÇÇÏ¿© »ç¿ëµÉ ¼ö ÀÖµµ·Ï Á¦°øµÇ´Â °ÍÀÌ´Ù. SIGUSR1 & SIGUSR2 : SIGTERM °ú ¸¶Âù°¡Áö·Î À̰͵éÀº Ä¿³Î¿¡ ÀÇÇÏ¿© »ç¿ë µÇ´Â°ÍÀÌ ¾Æ´Ï¶ó »ç¿ëÀÚ°¡ ¿øÇÏ´Â ¸ñÀûÀ»À§ÇÏ¿© »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ ¹Û¿¡µµ ±¸ÇöµÈ ¹æ½Ä¿¡ µû¶ó ¿©·¯°¡Áö ½Ã±×³ÎÀÌ ÀÖ´Â µ¥ À̵é Áß ´ëºÎºÐÀº Ä¿³ÎÀÌ ¿À·ù»óŸ¦ ³ªÅ¸³»´Â µ¥ »ç¿ëµÈ´Ù. ±¸Çö¹æ¹ý¿¡ µû¶ó ´Ù¸£°Ô ÀÛµ¿ÇÏ´Â ½Ã±×³Î Áß °¡Àå Áß¿äÇÑ °ÍÀº SIGCLD(death of a child) ½Ã±×³ÎÀÌ´Ù. ÀÌ°ÍÀº ÃÖ ±ÙÀÇ UNIX ½Ã½ºÅÛ¿¡¼­ exit ¿Í wait ½Ã½ºÅÛ È£ÃâÀ» ±¸ÇöÇϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù. SIGCLD ´Â exit °¡ ¼öÇàµÉ¶§ ±× ÇÁ·Î¼¼½ºÀÇ ºÎ¸ðÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. Á¤»ó°ú ºñÁ¤»ó Á¾·á ´ëºÎºÐÀÇ ½Ã±×³ÎÀº ±× ½Ã±×³ÎÀÌ ¹Þ¾ÆÁ³À» ¶§ Á¤»óÁ¾·á°¡ µÈ´Ù. ÀÌ°ÍÀº ÇÁ·Î ¼¼½º°¡ »çÀüÁغñ ¾øÀÌ exit È£ÃâÀ» ¼öÇàÇÑ °Í°ú °°Àº È¿°úÀÌ´Ù. SIGQUIT, SIGILL, SIGTRAP, SIGSYS, SIGFPE µîÀÇ ½Ã±×³ÎÀº ºñÁ¤»ó Á¾·á»óŸ¦ ÃÊ·¡ÇÏ°í ÀÌ È¿°ú´Â ÄھƴýÇÁ·Î ³ªÅ¸³­´Ù. UNIX µð¹ö°Å sdb ¿Í adb ´Â ÄÚ¾ÆÈ­ÀÏÀÇ Çü½Ä À» ¾Ë°í À־, ÄÚ¾Æ ´ýÇÁµÈ ¼ø°£ÀÇ ÇÁ·Î¼¼½º »óŸ¦ ¾Ë¾Æº¸´Â µ¥ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ¿©±â¼­ abort ·çƾÀ» »ìÆ캸´Â °Íµµ ÀǹÌÀÖ´Â ÀÏÀÌ´Ù. abort(); abort ´Â ¹«¾ùÀΰ¡ À߸øµÆÀ» ¶§ ÇÁ·Î¼¼½º°¡ ÇöÀç »óŸ¦ ±â·ÏÇÒ ¼ö ÀÖµµ·Ï ÇϹǷΠ¾ÆÁÖ À¯¿ëÇÑ µð¹ö±ë µµ±¸ÀÌ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ ÇÁ·Î¼¼½º°¡ ÀÚ±âÀڽſ¡°Ô ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù. 6.2.2. signal ½Ã½ºÅÛÈ£ÃâÀ» ÀÌ¿ëÇÑ ½Ã±×³Îó¸® #include int func(), (*was)(), sig; . . was = signal(sig, func); ù¹ø° Àμö sig ´Â ´ë»óÀÌ µÇ´Â ½Ã±×³ÎÀ» ÁöÁ¤ÇÑ´Ù. signal ÀÌ È¿°ú¸¦ ¹ßÈÖ Çϱâ À§Çؼ­´Â ´ë»óÀÌ µÇ´Â ½Ã±×³ÎÀÌ µµ´ÞÇϱâ Àü¿¡ È£ÃâÀÌ ¼öÇàµÇ¾î¾ß ÇÑ´Ù. SIGKILL À» Á¦¿ÜÇÏ°í´Â ¾Õ¿¡¼­ Á¤ÀÇÇÑ ¾î¶² ½Ã±×³Îµµ sig °¡ µÉ ¼ö ÀÖ´Ù. SIGKILL Àº ¾î¶² °æ¿ì¿¡µµ ÇÁ·Î¼¼½º¸¦ Á¾·á½Ãų ¼ö ÀÖµµ·Ï Çϱâ À§ÇÏ¿© Á¦¿ÜµÇ ¾ú´Ù. signal ÀÇ µÎ¹ø° Àμö func ´Â ½Ã±×³Î¿¡ ´ëÇÑ Ã³¸®¸¦ ³ªÅ¸³½´Ù. ÀÌ°ÍÀº ¼¼°¡Áö °ªÀ» °¡Áú¼ö ÀÖ´Ù. 1. Á¤¼ö°ªÀ» µ¹·ÁÁÖ´Â ÇÔ¼öÀÇ ÁÖ¼Ò. 2. SIG_IGN ½Ã±×³ÎÀ» ¹«½ÃÇ϶ó´Â ÀǹÌÀÇ Æ¯º°ÇÑ ±âÈ£ À̸§. ÇÁ·Î¼¼½º´Â sig ÇüÀÇ ½Ã±×³ÎÀ» ¸ðµÎ ¹«½ÃÇÑ´Ù. 3. SIG_DFL ½Ã½ºÅÛÀÇ ¹¬½ÃÀû(default) ó¸® »óÅ·Πº¹¿øÇÏ´Â ±âÈ£À̸§. ¸ðµç Ç¥ÁØ ½Ã±×³Î¿¡ ´ëÇÏ¿© ÀÌ°ÍÀº Á¤»ó ¶Ç´Â ºñÁ¤»ó Á¾·á¸¦ ÀǹÌÇÑ´Ù. 6.2.3. ½Ã±×³Î°ú ½Ã½ºÅÛ È£Ãâ ´ëºÎºÐÀÇ °æ¿ì ÇÁ·Î¼¼½º°¡ ½Ã½ºÅÛ È£ÃâÀ» ¼öÇàÇÏ´Â µµÁß¿¡ ½Ã±×³ÎÀÌ µµÂøÇÏ ¸é, ½Ã±×³ÎÀº ½Ã½ºÅÛ È£ÃâÀÌ Á¾·áÇÒ ¶§±îÁö ¾Æ¹«·± ¿µÇâÀ» ¹ÞÁö¾Ê´Â´Ù. ±×·¯³ª ¸î¸î ½Ã½ºÅÛ È£ÃâµéÀº ´Ù¸£°Ô 󸮵Ǵµ¥, À̵éÀº ½Ã±×³Î¿¡ À¸ÇÏ¿© ÀÎÅÍ·´Æ® ¸¦ ¹Þ´Â´Ù. ÀÌ·± È£ÃâµéÀº ´À¸° ÀåÄ¡(µð½ºÅ© È­ÀÏÀÌ ¾Æ´Ï¶ó ´Ü¸»±â¿Í °°Àº °Í µé)¿¡ ´ëÇÑ read, write ¶Ç´Â open, wait ¶Ç´Â pause È£ÃâÀÌ´Ù. if(write(tfd, buf, SIZE) < 0){ if(errno == EINTR){ warn("Write interrupted"); . . } } 6.2.4. ½Ã±×³Î ÀçÁöÁ¤ ´ëºÎºÐÀÇ ½Ã±×³Î(SIGILL °ú SIGTRAP Àº Á¦¿Ü)¿¡ ´ëÇÑ Ã³¸® ÇÔ¼ö´Â ½Ã±×³ÎÀÌ Æ÷ÂøµÈ ÈÄ Áï½Ã ÀçÁöÁ¤µÈ´Ù. /* reset -- signal example */ #include int interrupt() { printf("Interrupt called\n"); sleep(10); } main() { signal(SIGINT, interrupt); printf("Interrupt set for SIGINT\N"); sleep(10); } ÇÁ·Î±×·¥Àº ¿ì¼± ½Ã±×³Î SIGINT ÀÇ Ã³¸®ÇÔ¼ö·Î interrupt ¸¦ ÁöÁ¤ÇÏ°í, ¸Þ½Ã Áö¸¦ Ãâ·ÂÇÑ ÈÄ 10 ÃÊ µ¿¾È Á¤ÁöÇÑ´Ù. ¸¸¾à »ç¿ëÀÚ°¡ ÀÎÅÍ·´Æ® Å°¸¦ ´©¸£¸é, interrupt°¡ ¼öÇàµÇ¸é¼­ ´Ù¸¥ ¸Þ½ÃÁö°¡ Ãâ·ÂµÇ°í sleepÀÌ µÎ¹ø°·Î ¼öÇàµÈ´Ù. ±×·¯³ª ¸¸¾à ÀÎÅÍ·´Æ® Å°°¡ ¶Ç ´Ù½Ã ´­·¯Áö¸é ÇÁ·Î¼¼½º´Â Á¾·áÇÑ´Ù. UNIX ½Ã±× ³ÎÀº ´©ÀûµÇÁö ¾Ê´Â ´Ù´Â °Í¿¡ À¯ÀÇÇ϶ó. ´Ù½Ã ¸»Çϸé ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡ ´ëÇÏ ¿© ÇÑ ¼ø°£¿¡´Â °°Àº Á¾·ùÀÇ ½Ã±×³ÎÀÌ ¿ÀÁ÷ Çϳª¸¸ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é¿¡ ¿© ·¯ Á¾·ùÀÇ ½Ã±×³ÎÀº µ¿½Ã¿¡ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. 6.2.5. kill ¸¦ ÀÌ¿ëÇÑ ½Ã½º³Î Àü¼Û ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º°¡ º¸³½ ½Ã±×³ÎÀ» ó¸®Çϱâ À§ÇÏ¿© signal À» È£Ãâ ÇÑ´Ù. ½Ã±×³ÎÀ» º¸³»´Â ÀÛ¾÷Àº kill ½Ã½ºÅÛ È£ÃâÀ» ÅëÇÏ¿© ÀÌ·ç¾îÁø´Ù. #include int pid, sig, retval; . . retval = kill(pid, sig); ù¹ø° Àμö pid ´Â ½Ã±×³Î sig °¡ º¸³»Áú ÇÁ·Î¼¼½ºµéÀ» °áÁ¤ÇÑ´Ù. kill(1234, SIGTERM); ÇÁ·Î¼¼½º ¹øÈ£°¡ 1234 ÀÎ ÇÁ·Î¼¼½º¿¡ SIGTERM ½Ã±×³ÎÀ» º¸³»´Â °ÍÀ» ÀǹÌÇÑ ´Ù. ÇÁ·Î¼¼½º´Â ÀÚ±âÀڽſ¡°Ôµµ ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Ù. kill ÀÇ pid Àμö´Â Ưº°ÇÑ Àǹ̸¦ °¡Áö´Â ´Ù¸¥ °ªµéÀÌ µÉ ¼öµµ ÀÖ´Ù. ´ÙÀ½Àº °¡´ÉÇÑ ³×°¡Áö¸¦ ³ª ¿­ÇÑ °ÍÀÌ´Ù. 1. pid °¡ 0 ÀÌ¸é ½Ã±×³ÎÀº º¸³»´Â ÇÁ·Î¼¼½º¿Í °°Àº ÇÁ·Î¼¼½º ±×·ë¿¡ ¼ÓÇÏ´Â ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. 2. pid °¡ -1 ÀÌ°í ÇÁ·Î¼¼½ºÀÇ À¯È¿»ç¿ëÀÚ ½Ä º°¹øÈ£°¡ ½´ÆÛ»ç¿ëÀÚ°¡ ¾Æ´Ï¸é ½Ã±×³ÎÀº ½Ç»ç¿ëÀÚ ½Äº°¹øÈ£°¡ º¸³»´Â ÇÁ·Î¼¼½ºÀÇ À¯È¿»ç¿ëÀÚ ½Äº°¹øÈ£¿Í °°Àº ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù. ¿©±â¿¡´Â º¸³»´Â ÇÁ·Î¼¼½ºµµ Æ÷ÇԵȴÙ. 3. pid °¡ -1 ÀÌ°í À¯È¿»ç¿ëÀÚ ½Äº°¹øÈ£°¡ ½´ÆÛ»ç¿ëÀÚÀÌ¸é ½Ã±×³ÎÀº Ư¼öÇÑ ½Ã½ºÅÛÇÁ·Î¼¼½º¸¦ Á¦¿ÜÇÑ ¸ðµç ÇÁ·Î¼¼½º¿¡ º¸³»Áø´Ù.(Ư¼öÇÑ ½Ã½ºÅÛ ÇÁ·Î ¼¼½º¸¦ Á¦¿ÜÇÏ´Â °ÍÀº ÇÁ·Î¼¼½ºÀÇ ±×·ì¿¡ ½Ã±×³ÎÀ» º¸³»´Â °æ¿ì¿¡´Â ¸ðµÎ ÇØ´çµÇ´Âµ¥ ¿©±â¼­´Â ƯÈ÷ Áß¿äÇÏ´Ù.) 4. ¸¶Áö¸·Àº pid °¡ 0 º¸´Ù ÀÛÀ¸¸é¼­ -1 ÀÌ ¾Æ´Ñ °æ¿ì·Î ½Ã±×³ÎÀº ÇÁ·Î¼¼½ºÀÇ ±×·ì ½Äº° ¹øÈ£°¡ pid ÀÇ Àý´ë°ª°ú °°Àº ¸ðµç ÇÁ·Î¼¼½º º¸³»Áø´Ù. ÀÌ°ÍÀº ¶§¶§·Î º¸³»´Â ÇÁ·Î¼¼½º¸¦ Æ÷ÇÔÇÑ´Ù. 6.2.6. alarm ½Ã½ºÅÛ È£Ãâ alarm Àº ÇÁ·Î¼¼½ºÀÇ ¾Ë¶÷½Ã°è¸¦ Á¶ÀÛÇÏ´Â °£´ÜÇÏ°íµµ À¯¿ëÇÑ ½Ã½ºÅÛ È£ÃâÀÌ ´Ù. ŸÀ̸Ӱ¡ Á¾·áµÈ °ÍÀ» ÇÁ·Î±×·¥¿¡ ¾Ë·ÁÁÖ±â À§ÇÏ¿© ½Ã±×³ÎÀÌ »ç¿ëµÈ´Ù. unsigned int remain, secs; . . remain = alarm(secs); secs ´Â ½Ã°£À» ÃÊ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù. alarm Àº ÇÁ·Î¼¼½ºÀÇ ¼öÇàÀ» ÁßÁö½ÃÅ°´Â sleep °ú´Â ´Ù¸£´Ù. alarm Àº ´ë½Å¿¡ Áï½Ã º¹±ÍÇÏ¿© SIGALRM ½Ã±×³ÎÀÌ µµÂøÇÒ ¶§±îÁö Á¤»óÀûÀ¸·Î ¼öÇàÀ» °è¼ÓÇÑ´Ù. ÀÛµ¿ÁßÀÎ ¾Ë¶÷½Ã°è´Â exec È£ÃâÀÌ ¼öÇàµÇ ´õ¶óµµ °è¼ÓÇؼ­ ÀÛµ¿ÇÑ´Ù.(±×·¯³ª, fork ¸¦ ¼öÇàÇÑ ÈÄ ¿¡ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ¾Ë¶÷½Ã°è´Â ´õÀÌ»ó ÀÛµ¿ ÇÏÁö ¾Ê´Â´Ù.) ¾Ë¶÷Àº 0 À» Àμö·Î ÇÏ´Â alarm À» È£ ÃâÇϸé Ãë¼ÒµÈ´Ù. /* turn alarm clock off */ alarm(0); 6.2.7. pause ½Ã½ºÅÛ È£Ãâ UNIX ´Â alarm °ú °°Àº ºÎ·ùÀÎ pause ½Ã½ºÅÛ È£ÃâÀ» Á¦°øÇÑ´Ù. int retval; retval = pause(); pause ¸¦ È£ÃâÇÑ ÇÁ·Î¼¼½º´Â SIGALRM µîÀÇ ½Ã±×³ÎÀÌ µµÂøÇÒ ¶§±îÁö ½Ã½ºÅÛ ÀÚ ¿øÀ» ³¶ºñÇÏÁö ¾Êµµ·Ï ¼öÇàÀÌ ÁßÁöµÈ´Ù. 6.2.8. setjmp ¿Í longjmp ¶§¶§·Î ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§ ÇÁ·Î±×·¥À» ÀÌÀüÀÇ »óÅ·Πº¹±¸Çá¿©¾ß ÇÒ ¶¼°¡ ÀÖ ´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ°¡ ÀÎÅÍ·´Æ® Å°¸¦ Ä¡¸é ÇÁ·Î±×·¥ÀÇ ÁÖ¸Þ´º·Î µ¹¾Æ°¡°Ô ÇØ ¾ß ÇÑ´Ù°í ÇÏÀÚ. ÀÌ°ÍÀº µÎ°³ÀÇ Æ¯¼öÇÑ ¼­ºê·çƾ setjmp ¿Í longjmp ¸¦ ÀÌ¿ëÇÏ ¿© ó¸®µÉ ¼ö ÀÖ´Ù. setjmp ´Â ÇÁ·Î±×·¥ÀÇ ÇöÀç »óŸ¦ ÀúÀåÇÏ°í (»ç½Ç ½ºÅÃÀÇ ³»¿ëÀ» ÀúÀåÇÑ´Ù). longjmp ´Â ÀúÀåµÈ »óŸ¦ ´Ù½Ã º¹±¸ÇÑ´Ù. /* example use of setjmp and longjmp */ #include #include #include jmp_buf position; main() { int goback(); . . /* save current position */ setjmp(position); signal(SIGINT, goback); domenu(); . . } goback() { signal(SIGINT, SIG_IGN); fprintf(stderr, "\nInterrupted\n"); /* go back to saved position */ longjmp(position, 1); } signal ÀÌ ¼öÇàµÈ ÈÄ¿¡ »ç¿ëÀÚ°¡ ÀÎÅÍ·´Æ® Å°¸¦ Ä¡¸é, ¿ì¼± goback ÀÌ ¼öÇàµÈ ´Ù. goback Àº longjmp ¸¦ È£ÃâÇÏ°í, setjmp °¡ ÀúÀåÇÑ ÇÁ·Î±×·¥ À§Ä¡·Î Á¦¾î ¸¦ Àü´ÞÇÑ´Ù. µû¶ó¼­ ÇÁ·Î±×·¥Àº ¹æ±Ý setjmp ¿¡¼­ º¹±ÍÇÑ °Íó·³ ¼öÇàÀÌ °è¼Ó µÈ´Ù. ÀÌ °æ¿ì¿¡ setjmp ÀÇ º¹±Í°ªÀº longjmp ÀÇ µÎ¹ø° Àμö°¡ µÈ´Ù. 6.3. ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ Åë½Å ÆÄÀÌÇÁ´Â ÇÁ·Î¼¼½º¸¦ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ¿¬°á½ÃÄÑ ÁÖ´Â ÀϹæÅëÇØÀÇ Åë½Åä³Î·Î UNIX ÀÇ È­ÀÏ °³³ä À» ÀϹÝÈ­ ÇÑ °ÍÀÌ´Ù. ÇÁ·Î¼¼½º´Â write ½Ã½ºÅÛ È£ÃâÀ» ÀÌ ¿ëÇÏ¿© ÀڷḦ ÆÄÀÌÇÁ¸¦ ÅëÇÏ¿© º¸³¾ ¼ö ÀÖ°í, ´Ù¸¥ ÇÁ·Î¼¼½º°¡ read ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ÀÌ ÀڷḦ ÀоîµéÀÏ ¼ö ÀÖ´Ù. 6.3.1. ¸í·É¾î ¼öÁØ¿¡¼­ÀÇ ÆÄÀÌÇÁ ´ëºÎºÐÀÇ UNIX »ç¿ëÀÚ´Â ¸í·É¾î ¼öÁØ¿¡¼­ ÆÄÀÌÇÁ¸¦ Á¢Çغ¸¾ÒÀ» °ÍÀÌ´Ù. $pr doc | lp À» ¼öÇàÇÏ¸é ½©Àº ¸í·É¾î pr °ú lp ¸¦ µ¿½Ã¿¡ ½ÃÀÛÇÑ´Ù. ¹®ÀÚ '|' ´Â pr ÀÇ Ç¥ÁØ Ãâ·Â°ú lp ÀÇ Ç¥ÁØÀÔ·ÂÀ» ¿¬°áÇÏ´Â ÆÄÀÌÇÁ¸¦ ÀǹÌÇÑ´Ù. ÆÄÀÌÇÁ, ƯÈ÷ ¸ê ·É¾î ¼öÁØ¿¡¼­ÀÇ ÆÄÀÌÇÁ´Â UNIX ÀÇ °¡Àå °­·ÂÇÏ°í ´«¿¡ µÎµå·¯Áö´Â Ư¡ ÁßÀÇ ÇϳªÀÌ´Ù. ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÏ¸é ¿©·¯ ¸í·É¾îµéÀ» °£´ÜÈ÷ Çϳª·Î ¿¬°áÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ UNIX ÇÁ·Î±×·¥µéÀº Ç¥ÁØÀԷ°ú Ç¥ÁØÃâ·ÂÀ» ÀÔ.Ãâ·ÂÀ¸·Î ÇÏ°í Àß Á¤ÀÇ µÈ ÇϳªÀÇ ÀÛ¾÷À» ó¸®ÇÏ´Â ÀϹÝÀûÀÎ µµ±¸·Î °³¹ßµÉ ¼ö ÀÖ´Ù. 6.3.2. ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹Ö ÇÁ·Î±×·¥¿¡¼­ ÆÄÀÌÇÁ´Â pipe ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ¸¸µé¾îÁø´Ù. ½Ã½ºÅÛ È£ ÃâÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, µÎ°³ÀÇ È­Àϱâ¼ú¾î°¡ ¾ò¾îÁø´Ù. ±×Áß Çϳª´Â ÆÄÀÌ ÇÁ¿¡ ¾²±â À§ÇÑ °ÍÀÌ°í ´Ù¸¥ Çϳª´Â ÆÄÀÌÇÁ·ÎºÎÅÍ Àбâ À§ÇÑ °ÍÀÌ´Ù. int filedes[2], retval; retval = pipe(filedes); filedes ´Â ÆÄÀÌÇÁ¸¦ ½Äº°ÇÏ´Â È­Àϱâ¼ú¾î¸¦ ÀúÀåÇÏ´Â Å©±â°¡ 2 ÀÎ Á¤¼ö ¹è¿­ ÀÌ´Ù. È£ÃâÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, filedes[0] ´Â ÆÄÀÌÇÁ·ÎºÎÅÍ ÀÔ·ÂÀ» ¾òÀ» ¼ö ÀÖµµ·Ï °³¹æµÇ°í, filedes[1] Àº ÆÄÀÌÇÁ¿¡ Ãâ·ÂÇÒ ¼ö ÀÖµµ·Ï °³¹æµÈ´Ù. ÆÄ ÀÌÇÁ´Â ÀڷḦ first-in-first-out(FIFO)¿¡ ±Ù°ÅÇÏ¿© ó¸®ÇÑ´Ù. ´Ù½Ã ¸»Çϸé, ÆÄÀÌÇÁ¿¡ ¸ÕÀú ¾²¿©Áø °ÍÀÌ ÆÄÀÌÇÁ·ÎºÎÅÍ ¸ÕÀú ÀÐÇôÁø´Ù. ÀÌ ¼ø¼­´Â lseek ÀÌ ÆÄÀÌÇÁ¿¡´Â Àû¿ëµÇÁö ¾Ê±â ¶§¹®¿¡ º¯È­µÉ ¼ö ¾ø´Ù. ÆÄÀÌÇÁÀÇ ÁöÁ¤ÇÑ °¡Ä¡´Â fork ½Ã½ºÅÛÈ£Ãâ°ú ÇÔ²² »ç¿ëµÉ ¶¼ ¹ßÈֵȴÙ. À̶§ È­Àϱâ¼ú¾î´Â fork °¡ ¼öÇà µÈ ÈÄ¿¡µµ °è¼Ó À¯È¿Çϴٴ Ư¼ºÀÌ ÀÌ¿ëµÈ´Ù. 6.3.3. ÆÄÀÌÇÁÀÇ Å©±â Çö½ÇÀûÀ¸·Î ÆÄÀÌÇÁÀÇ Å©±â´Â À¯ÇÑÇÏ´Ù. ´Ù½Ã ¸»Çϸé ÀÏÁ¤ÇÑ Çѵµ³»ÀÇ ÀڷḸ ÀÌ ÀÐÈ÷Áö ¾ÊÀº »óÅ·ΠÆÄÀÌÇÁ¿¡ ³²¾Æ ÀÖÀ» ¼ö ÀÖ´Ù. ÀÌ Çѵµ´Â ÀϹÝÀûÀ¸·Î 5120 ¹ÙÀÌÆ®ÀÌ´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡´Â ÀÌ Çѵµ°¡ ÃæºÐÇÏÁö¸¸, ÀÌ ÃÖ´ë Å©±â´Â read ¿Í write ÀÇ ¼öÇà°ú °ü°è°¡ ÀÖ´Ù. ÆÄÀÌÇÁÀÇ ¿ë·®À» ÃÊ°úÇÏ´Â write °¡ ½Ã µµµÇ¸é ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© ÀÚ·á°¡ ÀÐÇôÁ® ÆÄÀÌÇÁ¿¡ ÃæºÐÇÑ °ø °£ÀÌ ¸¶·ÃµÉ ¶§±îÁö ¼öÇàÀÌ ÁߴܵȴÙ. 6.3.4. ÆÄÀÌÇÁ ´Ý±â ÆÄÀÌÇÁÀÇ ÇÑÂÊ ³¡À» ³ªÅ¸³»´Â È­Àϱâ¼ú¾î°¡ ´ÝÈ÷´Â °æ¿ì¿¡´Â ¾î¶²ÀÏÀÌ »ý±æ ±î? 1. ¾²±âÀü¿ë È­Àϱâ¼ú¾î¸¦ ´Ý¾ÒÀ» ¶§. ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀڷḦ ¾²±â À§ÇØ ÇØ ´ç ÆÄÀÌÇÁ¸¦ °³¹æÇÑ °æ¿ì¿¡´Â ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù. 2. ÀбâÀü¿ë È­Àϱâ¼ú¾î¸¦ ´Ý¾ÒÀ» ¶§. ÀڷḦ ÀбâÀ§ÇØ ÇØ´ç ÆÄÀÌÇÁ¸¦ °³¹æÇÑ ÇÁ·Î¼¼½º°¡ ÀÖ´Â °æ¿ì¿¡´Â ¾Æ¹« Àϵµ ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª ÆÄÀÌÇÁ·ÎºÎ ÅÍ ÀڷḦ ÀоîµéÀÌ´Â ÇÁ·Î¼¼½º°¡ ´õ ÀÌ»ó ¾øÀ¸¸é ±× ÆÄÀÌÇÁ¿¡ ÀڷḦ ¾µ ¼ö Àֱ⸦ ±â´Ù¸®´ø ¸ðµç ÇÁ·Î¼¼½º´Â Ä¿³Î·Î ºÎÅÍ SIGPIPE ½Ã±×³ÎÀ» ¹Þ´Â ´Ù. 6.3.5. ºí·°µÇÁö ¾Ê´Â read ¿Í write ÆÄÀÌÇÁ¿¡ ´ëÇÑ read ¿Í write °¡ ¾î¶² °æ¿ì¿¡µµ ºí·¯µÇÁö ¾Êµµ·Ï ÇÏ´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ù¹ø° ¹æ¹ýÀº ÆÄÀÌÇÁ¿¡ ´ëÇÑ fstat ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹æ ¹ýÀº ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ·ÎºÎÅÍ ÀڷḦ ÀоîµéÀÌ´Â °æ¿ì¿¡ Àû´çÇÏ´Ù. µÎ ¹ø° ¹æ¹ýÀº fcntl À» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. fcntl ÀÇ ±â´É Áß¿¡´Â ÇÁ·Î¼¼½º°¡ È­ ÀÏ ±â¼ú¾î ÀÇ O_NDELAY Ç÷¡±×¸¦ 1 ·Î ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº ÆÄÀÌ ÇÁ¿¡ ´ëÇÑ read ¿Í write °¡ ºí·°µÇÁö ¾Êµµ·Ï ÇÑ´Ù. #include . . if(fcntl(filedes, F_SETFL, O_NDELAY) < 0) perror("fcntl"); 6.3.6. ÆÄÀÌÇÁ¿Í exec ½Ã½ºÅÛ È£Ã⠵ΠÇÁ·Î±×·¥À» ½© ¼öÁØ¿¡¼­ ¿¬°áÇϱâ À§ÇÏ¿© ÆÄÀÌÇÁ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. $ls | ws ½©Àº °³¹æµÇ¾î ÀÖ´Â È­Àϱâ¼ú¾î°¡ exec È£ÃâÀ» ¼öÇàÇÑ ÈÄ¿¡µµ ¿©ÀüÈ÷ °³¹æµÇ ¾î ÀÖ´Ù´Â °ÍÀ» ÀÌ¿ëÇÑ´Ù. exec ¸¦ ¼öÇàÇϱâ Àü¿¡ ½©Àº ls ÀÇ Ç¥ÁØÃâ·ÂÀ» ÆÄÀÌ ÇÁÀÇ ¾²±âºÎºÐ¿¡ ¿¬°á½ÃÅ°°í, wc ÀÇ Ç¥ÁØ ÀÔ·ÂÀ» ÀбâºÎºÐ¿¡ ¿¬°á½ÃŲ´Ù. ÀÌ°Í Àº fcntl À» ÀÌ¿ëÇÏ¿© ÀÌ·ç¾îÁö°Å³ª dup È£ÃâÀ» ÀÌ¿ëÇÏ¿© ÀÌ·ç¾îÁø´Ù. dup Àº ´ÙÀ½°ú °°ÀÌ È£ÃâµÈ´Ù. dup(filedes); ÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é dup ´Â filedes ¿Í °°Àº È­ÀÏÀ» °¡¸®Å°´Â »õ·Î¿î È­ Àϱâ¼ú¾î¸¦ µ¹·Á ÁØ´Ù. /* close down standard output */ close(1); /* dup will now return "1" */ dup(filedes); . . /* program will now write its standard */ /* output to the file referred to by */ /* filedes */ . . 6.4. FIFO ¶Ç´Â ¸í¸íµÈ ÆÄÀÌÇÁ ÆÄÀÌÇÁ´Â °£°áÇÏ°íµµ °­·ÂÇÑ ÇÁ·Î¼¼½º°£ Åë½Å¼ö´ÜÀÌ´Ù. ±×·¯³ª ÆÄÀÌÇÁ¿¡´Â ¿© ·¯°¡Áö Áß´ëÇÑ °áÁ¡ÀÌ ÀÖ´Ù. ù°·Î ÆÄÀÌÇÁ´Â ºÎ¸ð¿Í ÀÚ½ÄÇÁ·Î¼¼½º¿Í °°ÀÌ Á¶ »ó(ancestry)ÀÌ °°Àº ÇÁ·Î¼¼½ºµéÀ» ¿¬°áÇÏ´Â µ¥¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. µÑ°, ÆÄÀÌ ÇÁ´Â ¿µ±¸È÷ Á¸ÀçÇÒ ¼ö ¾ø´Ù. ÀÌ·± °áÁ¡À» º¸¿ÏÇϱâ À§ÇÏ¿© UNIX ½Ã½ºÅÛ III ¿¡¼­´Â ÆÄÀÌÇÁÀÇ ÇÑ º¯ÇüÀÌ µµÀԵǾú´Ù. ÀÌ »õ·Î¿î ÇÁ·Î¼¼½º°£ Åë½Å¹æ½ÄÀº FIFO ¶Ç´Â ¸í¸í µÈ ÆÄÀÌÇÁ(named pipe)¶ó ºÒ¸°´Ù. FIFO ´Â ¿µ±¸ÀûÀÌ°í UNIX È­ ÀÏ À̸§À» ºÎ¿©¹Þ´Â´Ù. FIFO ´Â ¶ÇÇÑ ¼ÒÀ¯ÀÚ, Å©±â, Á¢±Ù Çã°¡µîÀÌ ÁöÁ¤µÈ´Ù. FIFO ´Â ´Ù¸¥ UNIX È­ÀÏó·³ °³¹æµÇ°í Æó¼âµÇ°í »èÁ¦µÉ ¼ö ÀÖÀ¸³ª, Àаųª ¾µ ¶§´Â ÆÄÀÌÇÁÀÇ ¼ºÁúÀ» ³ªÅ¸³½´Ù. FIFO °¡ ¸í·É¾î ¼öÁØ¿¡¼­´Â ¾î¶»°Ô »ç¿ëµÇ´Â Áö »ìÆ캸ÀÚ. FIFO ¸¦ ¸¸µé±â À§ÇÏ¿© mknod ¸í·ÉÀÌ »ç¿ëµÈ´Ù. $/etc/mknod channel p ¿©±â¼­ channel Àº FIFO ÀÇ À͸§ÀÌ´Ù. Àμö p´Â mknod °¡ FIFO ¸¦ »ý¼ºÇϵµ·Ï ÇÑ´Ù. ÀÌ FIFO ¸¦ Ç¥ÁØ UNIX ¸í·ÉÀ» »ç¿ëÇÏ¿© Àаųª ¾µ¼ö ÀÖ´Ù. $cat < channel ÀÌ ¸í·É¾î channel ÀÌ ¸¸µé¾îÁø Á÷ÈÄ ¼öÇàµÈ´Ù¸é, ÀÌ ¸í·É¿¡ ´ëÇÑ Ã³¸®°¡ Áö ¿¬µÉ °ÍÀÌ´Ù. ÀÌ°ÍÀº ÀڷḦ Àбâ À§ÇØ FIFO ¸¦ °³¹æÇÑ ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î ¼¼½º°¡ ÀڷḦ ¾²±â À§ÇØ FIFO ¸¦ °³¹æÇÒ ¶§±îÁö ºí·°µÇ±â ¶§¹®ÀÌ´Ù. ¸¶Âù°¡Áö ·Î ÀڷḦ ¾²±â À§ÇØ FIFO ¸¦ °³¹æÇÑ ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀڷḦ Àбâ À§ÇØ FIFO ¸¦ °³¹æÇÒ ¶§±îÁö ºí·°µÈ´Ù. 6.4.1. FIFO ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹Ö FIFO ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹ÖÀº ÀϹÝÀûÀÎ ÆÄÀÌÇÁ¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¡¹Ö°ú °°´Ù. Â÷ÀÌÁ¡Àº ´ÜÁö óÀ½¿¡ ÆÄÀÌÇÁ¸¦ ¸¸µå´Â ¹æ¹ý»ÓÀÌ´Ù. FIFO ´Â pipe ½Ã½ºÅÛ È£Ãâ À» ÀÌ¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó mknod ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÏ¿© ¸¸µé¾îÁø´Ù. FIFO ´Â ÀÏ´Ü ¸¸µé¾îÁö¸é open À» ÀÌ¿ëÇÏ¿© °³¹æµÈ´Ù. #include . . fd = open("fifo", O_WRONLY); ÀڷḦ ¾²±âÀ§ÇØ FIFO ¸¦ °³¹æÇÑ´Ù. ¾Õ Àý¿¡¼­ º» ¹Ù¿Í °°ÀÌ ÀÌ È£ÃâÀº ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀڷḦ ¾²±â À§ÇØ FIFO ¸¦ °³¹æÇÒ ¶§±îÁö ºí·°µÈ´Ù(¹°·Ð FIFO °¡ ÀÌ¹Ì ÀڷḦ ¾²±â À§ÇØ °³¹æµÇ¾î ÀÖ´Ù¸é, open Àº Áï½Ã º¹±ÍÇÒ °ÍÀÌ´Ù.) FIFO ¿¡ ´ëÇÑ ºí·°µÇÁö ¾Ê´Â open µµ °¡´ÉÇÏ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ­ open Àº O_RDONLY, O_WRONLY, O_ROWR ÁßÀÇ Çϳª¿Í ºñÆ® ´ÜÀ§ OR ¿¬»êµÈ O_NDELAY Ç÷¡ ±×¸¦ ÀÌ¿ëÇÏ¿© È£ÃâµÇ¾î¾ß ÇÑ´Ù. if((fd = open("fifo", O_RDONLY|O_NDELAY)) < 0) perror("open on fifo"); ÀڷḦ ¾²±â À§ÇØ FIFO ¸¦ °³¹æÇÑ ÇÁ·Î¼¼½º°¡ ¾ø´Ù¸é ÀÌ open Àº ºí·°µÇ´Â ´ë ½Å -1 À» µ¹·Á ÁÖ°í errno ´Â ENXIO °ªÀ» °¡Áø´Ù. ¹Ý¸é¿¡ open ÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, ÀÌÈÄ¿¡ ¼öÇàµÇ´Â FIFO ¿¡ ´ëÇÑ read ¿ª½Ã ºí·°µÇÁö ¾Ê´Â´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 59¹ø Á¦ ¸ñ:[moohou] Unix System Programming 7 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:40 ÀÐÀ½:3487 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 7 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦7Àå. ÇÁ·Î¼¼½º°£ Åë½Å : 2 7.1. ¼­·Ð Á¦ 6 Àå¿¡¼­ »ìÆ캻 ÇÁ·Î¼¼½º°£ÀÇ Åë½Å¹æ¹ýÀº ´ëºÎºÐÀÌ ¿©·¯ ÇØ µ¿¾È UNIX »ó ¿¡¼­ À¯¿ëÇÏ°Ô »ç¿ëµÈ °ÍµéÀÌ´Ù. ½Ã½ºÅÛ V ¿¡¼­´Â ¸î°¡Áö »õ·Î¿î ±â´ÉÀÌ µµÀÔ µÇ¾î AT&T ÀÇ ½Ã½ºÅÛ V ÀÎÅÍÆäÀ̽º Á¤ÀÇ¿¡ ¼ö·ÏµÇ¾ú´Ù. ¿ì¼± °¡Àå °£´ÜÇÑ °ÍÀº ·¹ÄÚµå ·ÏÅ·(record locking)À¸·Î¼­ ÀÌ´Â Á÷Á¢ÀûÀÎ ÇÁ·Î¼¼½º Åë½ÅÇüÅ°¡ ¾Æ´Ï ¶ó ÇÁ·Î¼¼½ºµéÀÇ Çù·Â¹æ¹ýÀÌ´Ù. ÀÌ°ÍÀº ÇÁ·Î¼¼½º°¡ ÀÚ½ÅÀÇ ¹èŸÀûÀÎ »ç¿ëÀ» À§ ÇØ È­ÀÏÀÇ ÀϺθ¦ ÀԽ÷Πº¸Á¸ÇÒ ¼ö ÀÖ°Ô ÇÏ¿©, µ¥ÀÌŸ º£À̽º°ü¸®ÀÇ ¸î°¡Áö ¾î·Á¿î ¹®Á¦ ¸¦ ÇØ°áÇÏ°Ô ÇÑ´Ù. ½Ã½ºÅÛ V ÀÇ »õ·Î¿î ÇÁ·Î¼¼½º°£ Åë½Å¹æ¹ý Áß ´Ù¸¥ °ÍµéÀº Á¶±ÝÀº ÀÌ»öÀûÀ̸ç, ½Ã½ºÅÛ V ÀÇ ±âº»¼³ºñ(facility)¸¦ È®ÀåÇÑ °Í À¸·Î »ý°¢ÇÒ¼ö ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÌµé »õ±â´ÉµéÀº IPC(IPC ´Â ÇÁ¼Ò¼¼½º°£ Åë½Å À» ÀǹÌÇÑ´Ù)¶ó ÇÑ´Ù. 1. ¸Þ½ÃÁö Àü´Þ(Message Passing) ¸Þ½ÃÁö Àü´Þ ¼³ºñ´Â ÇÁ·Î¼¼½º°¡ ¸Þ½ÃÁö¸¦ ÁÖ°í ¹ÞÀ» ¼ö ÀÖ°Ô ÇÑ´Ù. À̶§ ¸Þ ½ÃÁö¶õ ÀÔÀÇÀÇ ¹®ÀÚ¿­À̳ª ¹ÙÀÌÆ®¿­ÀÌ´Ù. 2. ¼¼¸¶Æ÷¾î(Semaphore) ¸Þ½ÃÁö Àü´Þ°ú ºñ±³Çϸé, ¼¼¸¶Æ÷¾î´Â ÇÁ·Î¼¼½º µ¿±âÈ­¸¦ À§ÇÑ º¸´Ù ÇϺÎÀû ÀÎ ¼ö´ÜÀ» Á¦°øÇÏ´Â °ÍÀ̸ç, ¸¹Àº ¾çÀÇ Á¤º¸¸¦ Àü´ÞÇÏ´Â °Í¿¡´Â ÀûÇÕÇÏÁö ¾Ê´Ù. 3. °øÀ¯¸Þ¸ð¸®(Shared Memory) ÀÌ°ÍÀº µÎ °³ ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ƯÁ¤ ¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ ÀÖ´Â ÀڷḦ °øÀ¯ ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¹°·Ð ÇÁ·Î¼¼½ºÀÇ ÀÚ·á ¿µ¿ªÀº º¸Åë ÀڽŸ¸ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ±â´ÉÀº IPC ¹æ¹ýÁß °¡Àå ºü¸£Áö¸¸ ¾à°£ÀÇ Çϵå¿þ¾î Áö¿øÀ» ÇÊ¿ä·Î ÇÑ´Ù. 7.2. ·¹ÄÚµå ·ÏÅ· 7.2.1. µ¿±â ·ÏÀº È­ÀÏ ³»¿ëÀ» °Çµå¸®Áö´Â ¾ÊÀ¸¸ç, ´Ù¸¥ ÇÁ·Î¼¼½ºµé¿¡°Ô ÇØ´ç µ¥ÀÌŸ°¡ »ç ¿ëÁßÀÓÀ» ³ªÅ¸³»´Â °ÍÀÌ´Ù. ÀÌ´Â ÇϳªÀÇ ³í¸®Àû ÀÛ¾÷ ¶Ç´Â Æ®·£Àè¼ÇÀ» ±¸¼ºÇÏ ´Â ÀÏ·ÃÀÇ Ã³¸® °úÁ¤ µµÁß¿¡ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ¶Ù¾îµå´Â °ÍÀ» ¸·´Â´Ù. ÀÌ·¯ÇÑ À¯ÇüÀÇ ¹æ¹ýÀ» ·¹ÄÚµå ·ÏÅ·À̶ó Çϸç, À̶§ÀÇ ·¹ÄÚµå´Â È­ÀÏÀÇ ÀÓÀÇÀûÀÇ ÀϺΠ¸¦ ÁöĪÇÑ´Ù. ¿Ïº®À» ±âÇϱâ À§Çؼ­´Â ·ÏÅ· ÀÛ¾÷ÀÌ ¿øÀÚÈ­ µÇ¾î¾ß ÇÑ´Ù. Áï, ÀÌ´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇÑ ¸ð¼øµÇ´Â ·ÏÅ· ½Ãµµ¿Í´Â º´ÇàµÉ ¼ö ¾ø´Ù. 7.2.2. lockf È£Ãâ #include int filedes, purpose, status; long recsize; . . status = lockf(filedes, purpose, recsize); lockf ´Â SVID ¿¡ Á¤ÀÇµÈ ·¹ÄÚµå ·ÏÅ· ±â¹ý Áß °¡Àå ´Ü¼øÇÑ °ÍÀÌ´Ù. lockf(±× ¸®°í fcntl)¿¡ ÀÇÇÑ ·ÏÅ·Àº ´ÜÁö ±Ç°í¿ë(advisory)ÀÌ´Ù. ÀÌ´Â È­ÀÏ Çã°¡¸¸ ÀÖ À¸¸é ÇÁ·Î¼¼½º´Â È­ÀÏ¿¡¼­ ·ÏÀÌ µÈ °ÍÀ¸·Î ¾Ë·ÁÁø ºÎºÐÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °Í À» ÀǹÌÇÑ´Ù. lockf ÀÇ Ã¹¹ø° Àμö filedes ´Â °³¹æµÈ È­ÀÏ ±â¼ú¾î¶ó¾ß ÇÑ´Ù. ÀÌ´Â ·ÏÀÌ ¼öÇàµÉ È­ÀÏÀ» ÁöÁ¤ÇÏ°í, O_WRONNLY ³ª O_RDWR ¸¦ »ç¿ëÇÏ¿© °³¹æµÈ °ÍÀ̶ó¾ß ÇÑ´Ù. purpose Àμö´Â lockf °¡ ½ÇÁ¦·Î ¹«¾ùÀ» ¼öÇàÇÒ °ÍÀΰ¡¸¦ °áÁ¤ ÇÑ´Ù. À̸¦ À§ÇØ Çã¿ëµÈ °ªµéÀº È­ÀÏ unistd.h ¿¡ ´Ù¸§°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù. #define F_ULOCK 0 /*Unlock a locked record */ #define F_LOCK 1 /*lock a record for excl usive use */ #define F_TLOCK 2 /*test for lock, lock if none */ #define F_TEST 3 /*test for existing lock only */ lockf ÀÇ ¸¶Áö¸· Àμö recsize ´Â ·Ï(lock), ÇØÁ¦(unlock), ¶Ç´Â ´Ü¼øÈ÷ °Ë»ç µÉ ¿µ¿ª(section)ÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ ¿µ¿ªÀÇ ½ÃÀÛÀ§Ä¡´Â È­ÀÏÀÇ Àбâ-¾²±â Æ÷ÀÎÅÍÀÇ ÇöÀçÀ§Ä¡¿Í °°´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î, lockf ´Â lseek ´ÙÀ½¿¡ È£ÃâµÈ´Ù. F_LOCK purpose °ªÀ» F_LOCK À¸·ÎÇÏ¿© lockf ¸¦ È£ÃâÇϸé, ½Ã½ºÅÛÀº È­ÀÏÀÇ Àбâ-¾² ±â Æ÷ÀÎÅÍ¿Í recsize ·Î Á¤ÀǵǴ ¿µ¿ª¿¡ ·ÏÀ» ÇÏ·Á ½ÃµµÇÑ´Ù. lockf(fdes, F_LOCK, 512L); ´Â ÇöÀçÀÇ Àбâ-¾²±â Æ÷ÀÎÅÍÀÇ À§Ä¡¿¡¼­ ½ÃÀÛÇÏ¿© 512 ¹ÙÀÌÆ®¿¡ ·ÏÀ» °Ç´Ù. F_ULOCK F_ULOCK Àº È£ÃâÇÁ·Î¼¼½º¿¡ ÀÇÇØ Àü¿¡ ·ÏµÈ ¿µ¿ªÀ» ÇØÁ¦(unlock)ÇÑ´Ù. ÀÌ´Â º¸Åë F_LOCK À̳ª F_TLOCK ÀÌ ¿äûµÈ ÈÄ¿¡ »ç¿ëµÈ´Ù. ¸¸¾à ¹æ±Ý ÇØÁ¦µÈ ¿µ¿ªÀ» ·ÏÇÏ·Á°í ±â´Ù¸®´ø ÇÁ·Î¼¼½º°¡ ÀÖ´Ù¸é, ±× Áß Çϳª°¡ ´Ù½Ã ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. F_TEST F_TEST ´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ÇØ´ç ¿µ¿ªÀÌ ·Ï µÇ¾ú´Â Áö¸¦ °Ë»çÇÏ´Â °ÍÀÌ ´Ù. ÀÌ¿µ¿ªµµ ¿ª½Ã È­ÀÏÀÇ ÇöÀç À§Ä¡¿Í Àμö recsize ¿¡ ÀÇÇØ ÁöÁ¤µÈ´Ù. ·Ï µÇ ¾î ÀÖÁö ¾Ê´Ù¸é lockf´Â 0 À» µ¹·ÁÁØ´Ù. F_TLOCK ÀÌ ¿äûÀº F_TEST ¿Í F_LOCK À» °áÇÕÇÑ °ÍÀ¸·Î, È­ÀÏ¿¡¼­ ±âÁ¸¿¡ ·ÏµÈ ¿µ¿ª À» ´Ù½Ã ·ÏÇÏ·Á ÇÒ¶§, ÇÁ·Î±×·¥ÀÌ ¼öÇàÀ» ÁßÁöÇÏÁö ¾Ê°í ´Ù¸¥ ÇൿÀ» °è¼ÓÇÏ·Á ´Â °æ¿ì¿¡ À¯¿ëÇÏ´Ù. ·Ï µÇÁö ¾ÊÀº ¿µ¿ª¿¡ ´ëÇØ F_TLOCK ÀÌ »ç¿ëµÇ¸é, F_LOCK °ú °°ÀÌ ·ÏÀÌ Àû¿ëµÈ´Ù. ·ÏµÈ ¿µ¿ª¿¡ ´ëÇؼ­´Â, lockf ´Â -1 À» µ¹·ÁÁÖ°í error ¸¦ EACCES (UNIX ÀÇ ¹Ì·¡ ¹öÀü¿¡´Â EAGAIN)·Î ÇÑ´Ù. recsize Àμö°¡ 0 °ªÀ» °®´Â °æ¿ì ¸¸¾à lockf ÀÇ Àμö recsize ÀÇ °ªÀÌ 0 À̶ó¸é, ·ÏµÇ´Â È­ÀÏÀÇ ¿µ¿ªÀº È­ÀÏ ÀÇ ÇöÀç À§Ä¡ºÎÅÍ È­ÀÏ Å©±âÀÇ ÃÖ´ë ÇÑ°è(ÀÌ´Â °¢ ±¸Çö¸¶´Ù ´Ù¸£´Ù)±îÁö·Î Á¤ ÇØÁø´Ù. lseek(fd, 0L, 0); lockf(fd, F_LOCK, 0L); ÀÌ°ÍÀº °£´ÜÈ÷ È­ÀÏ Àüü¸¦ ·ÏÇÑ´Ù. ±³ÇлóÅ µÎ ÇÁ·Î¼¼½º PA ¿Í PB °¡ °°Àº È­ÀÏ¿¡¼­ ÀÛ¾÷ÁßÀ̶ó ÇÏÀÚ. ¶Ç PA °¡ F_LOCK ¿äûÀÌ ÀÌ·¯ÇÑ ±³Âø»óŸ¦ À¯¹ßÇÏ·Á ÇÑ´Ù¸é, È£ÃâÀº ½ÇÆÐÇÏ¿© -1 À» µ¹·ÁÁÖ°í errno °ªÀ» EDEADLK À¸·Î ÇÑ´Ù.(EDEADLK Àº ½Ã½ºÅÛ ·Ï Å×À̺íÀÌ °¡µæÂù °æ¿ì µµ ÀǹÌÇÒ ¼ö ÀÖ´Ù.) 7.2.3. fcntl À» »ç¿ëÇÑ ·¹ÄÚµå ·ÏÅ· ¿ì¸®´Â ÀÌ¹Ì È­ÀÏÁ¦¾îÈ£Ãâ fcntl À» ¼Ò°³Çß´Ù. º¸ÅëÀÇ ±â´É°ú´Â º°µµ·Î fcntl Àº lockf º¸´Ù ÀϹÝÀûÀÎ ÇüÅÂÀÇ ·¹ÄÚµå ·ÏÅ·À» ¼öÇàÇϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ ´Â µÎ°¡Áö ÇüÅÂÀÇ ·ÏÀ» Á¦°øÇÑ´Ù. 1. ÀÐ±â ·Ï Àб⠷ÏÀº ´Ü¼øÇÏ°Ô ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ¾²±â ·ÏÀ̶ó´Â µÎ¹ø° ÇüÅÂÀÇ ·ÏÀ» ¸øÇϵµ·Ï ÇÑ´Ù. 2. ¾²±â ·Ï ¾²±â ·ÏÀº ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ Çش籸¿ª¿¡ Àб⳪ ¾²±â ·ÏÀ» ÇÒ ¼ö ¾øµµ·Ï ÇÑ´Ù. ·¹ÄÚµå ·ÏÅ·À» À§ÇØ fcntl À» ´ÙÀ½°ú °°ÀÌ »ç¿ëµÈ´Ù. #include struct lock ldata; int filedes, cmd, status; . . status = fcntl(filedes, cmd, &ldata); filedes Àμö´Â ¿ª½Ã À¯È¿ÇÑ °³¹æµÈ È­ÀÏ ±â¼ú¾î¶ó¾ß ÇÑ´Ù. Àб⠷ÏÀ» À§Çؼ­ ´Â filedes ´Â O_RDONLY ³ª O_RDWR À» ÀÌ¿ëÇؼ­ °³¹æµÇ¾î¾ß ÇÑ´Ù. µû¶ó¼­ creat ¿¡ ÀÇÇÑ È­ÀÏ ±â¼ú¾î´Â »ç¿ëµÉ ¼ö ¾ø´Ù. ¾²±â ·ÏÀ» À§Çؼ­´Â filedes ´Â O_WRONLY ³ª O_RDWR À» »ç¿ëÇØ °³¹æµÇ¾î¾ß ÇÑ´Ù. ·¹ÄÚµå ·ÏÅ·¿¡´ëÇÑ Àμö cmd ÀÇ °ªÀº ´ÙÀ½ÀÇ 3 °³ÀÌ´Ù. F_GETLK ldata Àμö¸¦ ÅëÇØ Àü´ÞµÈ µ¥ÀÌŸ¿¡ ±âÃÊÇؼ­ ·Ï Á¤º¸¸¦ ¾ò´Â´Ù.(µÇµ¹¾Æ¿À´Â Á¤º¸´Â ldata ¿¡ ±â¼úµÈ ·ÏÀ» 'ºí·°(block)'Çϴ ù¹ø° ·ÏÀ» °¡¸®Å²´Ù. F_SETLK È­ÀÏ¿¡ ·ÏÀ» ½ÃµµÇÏ°í, ºÒ°¡´ÉÇϸé Áï½Ã µÇµ¹¾Æ¿Â´Ù. È°µ¿ÁßÀÎ ·ÏÀ» Á¦°ÅÇÏ ´Â µ¥µµ »ç¿ëµÈ´Ù. F_SETLKW È­ÀÏ¿¡ ·ÏÀ» ½ÃµµÇÏ°í, ÀÌ°ÍÀÌ ¸¸¾à ´Ù¸¥ ÇÁ·Î¼¼½º ¼ÒÀ¯ÀÇ ·Ï¿¡ ÀÇÇØ ºí·°µÇ ¸é ¼öÇàÀ» ÁßÁöÇÑ´Ù. lockf ¿¡ F_LOCK ¸¦ »ç¿ëÇÑ °æ¿ì¿Í °°ÀÌ fcntl ·Ï¿¡ ÀÇ Çؼ­ ¼öÇàÀÌ Áß´ÜµÈ ÇÁ·Î¼¼½º´Â ½Ã±×³Î¿¡ ÀÇÇØ ÀÎÅÍ·´Æ® µÉ ¼ö ÀÖ´Ù. ±¸Á¶(structure) ldata ´Â ·Ï ±â¼ú¾îÀÌ´Ù. ÀÌÀÇ ÀÚ·áÇü flock Àº fcntl.h ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù. short l_type; /* descrives type of lock */ short l_whence; /*offset type, like lseek */ long l_start; /* offset in bytes */ long l_len; /* segment size in bytes */ short l_pid; /* set by F_GETLK command */ l_whence, l_start ±×¸®°í l_len Àº ·Ï, °Ë»ç, ¶Ç´Â ÇØÁ¦µÇ¾îÀý È­ÀÏÀÇ ±¸¿ª À» ÁöÁ¤ÇÑ´Ù. l_whence ´Â lseek ÀÇ ¼¼¹ø° Àμö¿Í ¸Å¿ì À¯»çÇÏ´Ù. Áï °ªÀ¸·Î ¼­ 0,1,2 ¸¦ °®´Â °æ¿ì¿¡ °¢°¢ È­ÀÏÀÇ Ã³À½, Àбâ-¾²±â Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â Çö ÀçÀÇ À§Ä¡, ±×¸®°í È­ÀÏÀÇ ³¡À» º¯À§(offset)ÀÇ ±âÁØÁ¡À¸·Î¼­ ³ªÅ¸³½´Ù. l_start ´Â ±¸¿ªÀÇ ½ÃÀÛ À§Ä¡¸¦ l_whence ¿¡ ´ëÇÑ »ó´ëÀ§Ä¡·Î¼­ ³ªÅ¸³½´Ù. l_len Àº ¹ÙÀÌÆ® ´ÜÀ§·Î¼­ÀÇ ±¸¿ªÀÇ ±æÀÌÀÌ´Ù. lockf ÀÇ °æ¿ì¿Í °°ÀÌ ÀÌ °ªÀÌ 0 À̸é, ¼¼±×¸ÕÆ®ÀÇ ±æÀÌ´Â °¡´ÉÇÑ ÃÖ´ëÀÇ º¯À§°¡ µÈ´Ù. l_type Àº Àû¿ëµÇ´Â ·ÏÀÇ ÇüŸ¦ Áö½ÃÇÑ´Ù. ÀÌ¿¡ ´ëÇÑ °ªµéÀº fcntl.h ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ ´Ù. F_RDLCK Àû¿ëµÇ´Â ·ÏÀÌ Àб⠷ÏÀÌ´Ù. F_WRLCK Àû¿ëµÇ´Â ·ÏÀÌ ¾²±â ·ÏÀÌ´Ù. F_UNLCK ƯÁ¤ ±¸¿ª¿¡ ´ëÇÑ ·ÏÀ» ÇØÁ¦ÇÑ´Ù. l_pid ´Â fcntl ÀÇ ¸í·ÉÀ¸·Î F_GETLK ÀÌ ¼±ÅÃµÈ °æ¿ì¿¡¸¸ À¯È¿ÇÏ´Ù. ÇöÀç ½Ã µµÇÏ´Â ·ÏÀÌ ±âÁ¸ÀÇ ·Ï¿¡ ÀÇÇØ ºí·°µÇ´Â °æ¿ì, l_pid ´Â ±âÁ¸ÀÇ ·Ï À» ÁöÁ¤ÇÑ ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ½Äº°¹øÈ£°ªÀ» °®´Â´Ù. 7.3. IPC ¼³ºñ 7.3.1. ¼Ò°³¿Í ±âº»°³³ä UNIX ½Ã½ºÅÛ V ´Â IPC ¼³ºñ¶ó´Â »õ·Ó°í ´Ù¾çÇÑ ÇÁ·Î¼¼½º°£ Åë½Å ¹æ¹ýÀ» Á¦°ø ÇÑ´Ù. ´ÜÀ§ ÀÛ¾÷µéÀÌ ¼­·Î Çù·ÂÇÏ´Â ½Ã½ºÅÛÀ» ÇÁ·Î±×·¥ÇÒ ¶§ ´Ù¾çÇÑ Á¾·ùÀÇ ¹æ ¹ý·ÐÀûÀÎ Á¢±ÙÀÌ °¡´É ÇÏ°Ô µÇ¾ú´Ù. ¹Ý¸é¿¡ IPC ¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º´Â º¸ÅëÀÇ UNIX °³³ä°ú´Â ¸ÂÁö ¾Ê¾Æ¼­, ÇØ´ç ºÎºÐÀº ½Ã½ºÅÛÀÇ ´Ù¸¥ ºÎºÐ°ú ºÎÁ¶È­¸¦ ÀÌ·é ´Ù. IPC ¼³ºñ´Â ´ÙÀ½ÀÇ ¼¼ ºÎ·ù·Î ³ª´¶´Ù. 1. ¸Þ½ÃÁö Àü´Þ 2. ¼¼¸¶Æ÷¾î 3. °øÀ¯¸Þ¸ð¸® IPC ¼³ºñ Å° °¡Àå Áß¿äÇÑ °øÅë ±â´ÉÀº IPC ¼³ºñ Å°ÀÌ´Ù. Å°¶õ È­ÀÏ À̸§ÀÌ È­ÀÏÀ» ÁöÁ¤ÇÏ ´Â °Í°ú ¸¶Âù°¡Áö·Î UNIX ½Ã½ºÅÛÀÇ IPC °´Ã¼¸¦ ÁöÁ¤ÇÏ´Â µ¥ »ç¿ëÇÏ´Â ¼ýÀÚÀÌ ´Ù. Áï Å°´Â ¿©·¯ ÇÁ·Î¼¼½º»çÀÌ¿¡ IPC ÀÚ¿øÀÌ ½±°Ô °øÀ¯µÇµµ·Ï ÇØÁØ´Ù. ÁöÁ¤µÉ ¼ö ÀÖ´Â °´Ã¼·Î´Â ¸Þ½ÃÁö Å¥, ¼¼¸¶Æ÷¾îÀÇ Á¢ÇÕ, ¶Ç´Â °øÀ¯ ¸Þ¸ð¸® ¼¼±×¸ÕÆ® µî À» µé ¼ö ÀÖ´Ù. Å°ÀÇ ½ÇÁ¦ ÀÚ·áÇüÀº ±¸Çö¿¡ Á¿ìµÇ´Â ÀÚ·áÇü key_t ¿¡ ÀÇÇØ °á Á¤µÈ´Ù. key_t ´Â ½Ã½ºÅÛ Çì´õÈ­ÀÏ types.h ¿¡¼­ Á¤ÀǵȴÙ. UNIX ÀÇ ¾î¶² ¹öÁ¯ Àº È­ÀÏÀÇ °æ·ÎÀ̸§À» Å°·Î º¯È¯ÇØÁÖ´Â ´Ü¼øÇÑ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ÀÌ ·çƾÀÇ À̸§Àº ftok ÀÌ´Ù. #include #include key_t keyval, ftok(); char *path, id; . . keyval = ftok(path, id); ÀÌ·çƾÀº È­ÀÏ path ¿¡ °ü·ÃµÈ Á¤º¸¿¡ ±âÃÊÇؼ­ Å° °ªÀ» µ¹·ÁÁØ´Ù. °°Àº path °ª¿¡ ´ëÇؼ­¶óµµ id °ªÀÌ ´Ù¸£¸é ´Ù¸¥ Å° °ªÀÌ »êÃâµÈ´Ù. ftok °¡ °¡Àå À¯¿ëÇÑ ÀÀ¿ëºÐ¾ß´Â, ¸í¸íµÈ È­ÀÏ µéÀ» Á¶ÀÛÇϴµ¥ IPC ±â´ÉµéÀÌ »ç¿ëµÉ °æ¿ì, ¶Ç´Â ÇÊ ¼ö ºÒ°¡°áÇÏ°í ¿µ±¸ÀûÀ̸鼭 ºÒº¯ÇÏ´Â È­ÀÏ¿¡ ´ëÇÑ À̸§ÀÌ ÁÖ¾îÁø °æ¿ìÀÌ´Ù. IPC get ¿¬»ê ÇÁ·Î±×·¥Àº IPC °´Ã¼¸¦ »ý¼ºÇϰųª ±âÁ¸ÀÇ °Í¿¡ Á¢±ÙÇÏ·Á ÇÒ ¶§ key ¸¦ »ç¿ë ÇÑ´Ù. µÎ°¡Áö ¸ðµÎ IPC get ¿¬»êÀ¸·Î È£ÃâµÈ´Ù. Çѹø »ý¼ºµÈ IPC ¼³ºñ ½Äº°ÀÚ ´Â À¯ÀÏÇÏ´Ù. Áï, ¼­·Î ´Ù¸¥ ÇÁ·Î¼¼½º¶óµµ µ¿ÀÏÇÑ IPC °´Ã¼¸¦ À§Çؼ­´Â °°Àº °ªÀ» »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¸é, ´ÙÀ½ÀÇ ¹®ÀåÀº IPC È£Ãâ msggetÀ» »ç¿ëÇÏ¿© »õ·Î ¿î ¸Þ½ÃÁö Å¥¸¦ »ý¼ºÇÑ´Ù. msg_qid = msgget((key_t)0100, 0644|IPC_ CREAT|IPC_EXCL); msgget ÀÇ Ã¹ Àμö´Â ¸Þ½ÃÁö Å¥ÀÇ Å°ÀÌ´Ù. ±×¹ÛÀÇ IPC ¿¬»ê IPC ¼³ºñ¿Í °°ÀÌ »ç¿ëµÇ´Â ¿¬»ê¿¡´Â ´ÙÀ½ÀÇ µÎ°¡Áö À¯ÇüÀÌ ÀÖ´Ù. Çϳª´Â »ó ÅÂÁ¤º¸¸¦ ¾ò°Å³ª Á¦¾î °ªÀ» ÁöÁ¤ÇÏ´Â Á¦¾î ¿¬»êÀÌ´Ù. ÀÌ¿¡ ¼ÓÇϴ ȣÃâ·Î´Â msgctl, semctl, shmctl µîÀÌ ÀÖ´Ù. ´Ù¸¥ Çϳª´Â Á» ´õ Ư¼öÇÑ ¿¬»êÀ¸·Î¼­, ºñ·Ï °¢°¢ÀÇ È£ÃâÀº ¼­·Î ´Ù¸¥ À̸§À» °®°í ÀÖÁö¸¸, Ç¥ÁØÇü ¸Å´º¾ó¿¡¼­´Â À̵é À» msgop, oemop, shmop À̶ó´Â Ç¥Á¦ÇÏ¿¡ ¸ð¾Æ³õ°í ÀÖ´Ù. ¿¹¸¦ µé¸é, msgop ¿¡ ´Â ´ÙÀ½ÀÇ µÎ ÇÔ¼ö°¡ ÀÖ´Ù. msgsnd ´Â ¸Þ½ÃÁö Å¥¿¡ ¸Þ½ÃÁö¸¦ Àü´ÞÇÏ°í, msgrcv ´Â ¸Þ½ÃÁö Å¥¿¡¼­ ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. »óÅÂÀڷᱸÁ¶ IPC °´Ã¼°¡ »ý¼ºµÇ¸é ½Ã½ºÅÛÀº IPC ¼³ºñ »óÅ ±¸Á¶¸¦ ¸¸µé¾î¼­ ÇØ´ç °´Ã¼¿Í °ü·ÃµÈ °¢Á¾ °ü¸® Á¤º¸¸¦ ¼ö·ÏÇÑ´Ù. »óÅ ÀÚ·á ±¸Á¶ÀÇ ÀÚ·á ÇüÀº ¸Þ½ÃÁö, ¼¼¸¶ Æ÷¾î, °øÀ¯ ¸Þ¸ð¸®¸¶´Ù Çϳª¾¿ Á¸ÀçÇÑ´Ù. ¼¼°¡ÁöÀÇ »óÅ ±¸Á¶ ÀÚ·áÇüÀº ¸ðµÎ °øÅëÀûÀ¸·Î Çã°¡ ±¸Á¶¸¦ Æ÷ÇÔÇÑ´Ù. ÀÌ Çã°¡±¸Á¶´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÇ¸ç ÅÂ±× (tag) ipc_perm À¸·Î ½Äº°µÈ´Ù. ushort cuid; /*user-id of creator of IPC object*/ ushort cgid; /* group-id of creator */ ushort uid; /* effective user-id */ ushort gid; /* effective group-id */ ushort umode; /* permissions */ ÀÌ »óÅ ÀÚ·á ±¸Á¶´Â »ç¿ëÀÚ°¡ IPC °´Ã¼¸¦ Àо ÇØ´ç Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Â Áö, ¶Ç´Â ±× °´Ã¼¿¡ Á¤º¸¸¦ ¾µ ¼ö ÀÖ´ÂÁö¸¦ °áÁ¤ÇÑ´Ù. 7.3.2. ¸Þ½ÃÁö Àü´Þ ¸Þ½ÃÁö¶õ º»ÁúÀûÀ¸·Î ¹®ÀÚ³ª ¹ÙÀÌÆ®ÀÇ ¿­ÀÌ´Ù.(¹Ýµå½Ã ³Î ¹®ÀÚ·Î ³¡³¯ ÇÊ¿ä´Â ¾ø´Ù.) ¸Þ½ÃÁö´Â ÇÁ·Î¼¼½º °£¿¡ ¸Þ½ÃÁö Å¥¸¦ ÅëÇØ Àü´ÞµÇ¸ç,¸Þ½ÃÁöÅ¥´Â msgget ÇÁ¸®¹ÌƼºê¿¡ ÀÇÇØ »ý¼ºµÇ°í Á¢±ÙµÈ´Ù. ÀÏ´Ü Å¥°¡ ¸¸µé¾îÁö¸é, Àû´çÇÑ ±Ç¸®¸¦ °¡Áø ÇÁ·Î¼¼½º°¡ msgrcv ¿¡ ÀÇÇØ ÀÌ ¸Þ½ÃÁö¸¦ Å¥¿¡ ³²±æ ¼ö ÀÖ´Ù. ´Ù¸¥ ÇÁ·Î¼¼ ½º´Â msgrcv ¿¡ ÀÇÇØ ÀÌ ¸Þ½ÃÁö¸¦ Å¥·ÎºÎÅÍ Á¦°ÅÇÑµÚ ÀоîµéÀÏ ¼ö ÀÖ´Ù. #include #include #include int msg_qid, permflags; key_t key; . . msg_qid = magget(key, permflags); ÀÇ È£ÃâÀº µÎ ±â´É open °ú creat ¸¦ µ¿½Ã¿¡ ¼öÇàÇÏ´Â °Í°ú °°ÀÌ »ý°¢µÇ¾îÁú ¼ö ÀÖ´Ù. permflags Àμö´Â msgget ÀÌ ¼öÇàÇØ¾ß ÇÒ ÀÛ¾÷À» Á¤È®È÷ °áÁ¤ÇÑ´Ù. À̵ °ü·ÃÀÌ ÀÖ´Â µÎ°³ÀÇ »ó¼ö°¡ ipc.h È­ÀÏ¿¡ Á¤ÀǵǾî Àִµ¥, À̵éÀº µ¶¸³ ÀûÀ¸·Î »ç¿ëµÉ ¼öµµ ÀÖ°í, ºñÆ®³¢¸® OR µÉ ¼öµµ ÀÖ´Ù. IPC_CREAT ÀÌ°ÍÀº key ¿¡ ÇØ´çÇÏ´Â ¸Þ½ÃÁö Å¥°¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡ msgget °¡ À̸¦ »ý¼ºÇϵµ·Ï Áö½ÃÇÑ´Ù. IPC_EXCL IPC_CREAT ¿Í ÀÌ°ÍÀÌ µ¿½Ã¿¡ ÁöÁ¤µÈ °æ¿ìÀÇ È£ÃâÀº ´ÜÁö ÇϳªÀÇ ¸Þ½ÃÁö Å¥ ¸¦ »ý¼ºÇÑ´Ù. msgop ·çƾµé : msgsnd ¿Í msgrcv ÀÏ´Ü Å¥°¡ »ý¼ºµÇ¸é, µÎ °³ÀÇ msgop ÇÁ¸®¹ÌƼºê¸¦ »ç¿ëÇÏ¿© À̸¦ ´Ù·ê¼ö ÀÖ ´Ù. ù¹ø °ÍÀº msgsnd ÀÌ´Ù. #include #include #include int msg_qid, size, flags, retval; struct my_msg{ long mtype; char mtext[SOMEVALUE]; }message; . . retval = msgsnd(msg_qid, &message, size, flags); msgsnd ´Â msgget À¸·ÎºÎÅÍ ¾òÀº msg_qid °¡ °¡¸®Å°´Â Å¥¿¡ ¸Þ½ÃÁö¸¦ º¸³½´Ù. ¸Þ½ÃÁö ÀÚü´Â ³î¶ó¿ó°Ôµµ »ç¿ëÀÚ°¡ Á¦°øÇÏ´Â ±¸Á¶·Î ¼±¾ðµÈ º¯¼ö message ¿¡ ´ã°ÜÁ® ÀÖ´Ù. struct my_msg{ long mtype; char mtext[SOMEVALUE]; }; msgsnd ÀÇ Àμö flags ´Â ´Ü ÇϳªÀÇ ÀǹÌÀÖ´Â °ªÀ» °®´Âµ¥ ÀÌ´Â IPC_NOWAIT ÀÌ´Ù. IPC_NOWAIT °¡ 0 ÀÎ °æ¿ì¿¡´Â ¸Þ½ÃÁö Àü´Þ¿¡ ÇÊ¿äÇÑ ½Ã½ºÅÛ ÀÚ¿øÀÌ ¾øÀ» ¶§ È£Ãâ ÇÁ·Î¼¼½ºÀÇ ¼öÇàÀÌ ÁߴܵȴÙ. msgop À¯Çü¿¡ ¼ÓÇÏ´Â ¶Ç ÇϳªÀÇ ÇÔ¼ö´Â msgrcv ÀÌ´Ù. #include #include #include int msg_qid, size, flags, retval; struct my_msg{ long mtype; char mtext[SOMEVALUE]; }message; long msg_type; . . retval = msgrcv(msg_qid, &message, size, msg_type, flags); msgrcv °¡ »ç¿ëµÇ¸é, Å¥ÀÇ »ç¿ë Çã°¡¿¡ ÀúÃ˵ÇÁö ¾Ê´Â ÇÑ, msg_id °¡ °¡¸®Å° ´Â Å¥·Î ºÎÅÍ ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. ¸Þ½ÃÁö¸¦ Å¥¿¡¼­ ÀÐ°Ô µÇ¸é À̴ ť¿¡¼­ ÀÚµ¿ÀûÀ¸·Î Á¦°ÅµÈ´Ù. À̶§ message º¯¼ö´Â ¹Þ¾ÆµéÀÎ ¸Þ½ÃÁö¸¦ ÀúÀåÇÏ°í, size º¯¼ö´Â ÀÌ ±¸Á¶¿¡ ´ã¾ÆµÑ ¼ö ÀÖ´Â Á¤º¸ÀÇ ÃÖ´ë±æÀ̸¦ ÁöÁ¤ÇÑ´Ù. È£ÃâÀÌ ¼º°øÇÏ ¸é ¹Þ¾ÆµéÀÎ ¸Þ½ÃÁöÀÇ ±æÀÌ°¡ retval ¿¡ ÁöÁ¤µÈ´Ù. msg_type Àμö´Â ½ÇÁ¦·Î ¾î ¶² ¸Þ½ÃÁö¸¦ ¹Þ¾Æµé ÀÏÁö¸¦ °áÁ¤ÇÑ´Ù. ¼±ÅÃÀ» ÇÏ´Â ±âÁØÀº ¸Þ½ÃÁöÀÇ mtype ÇÊ µåÀÌ´Ù. msg_type ÀÇ °ªÀÌ 0 ÀÎ °æ¿ì´Â Å¥ÀÇ Á¦ÀÏ Ã¹¹ø° ¸Þ½ÃÁö, Áï °¡Àå ÀÏ Âïµé¾î¿Â ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. msg_type ÀÇ °ªÀÌ 0 º¸´Ù Å« °æ¿ì´Â ÇØ´ç °ªÀ» °¡Áø ¸Þ½ÃÁöÀÇ Ã¹¹ø° °ÍÀ» Àд´Ù. ¸¶Áö¸·À¸·Î msg_type ÀÌ 0 º¸´Ù ÀÛÀº °æ¿ì °¡ ÀÖ´Ù. À̶§´Â ¸Þ½ÃÁöÀÇ mtype °ªÀÌ msg_type ÀÇ Àý´ë°ªº¸´Ù À۰ųª °°Àº °Í Áß¿¡¼­ ÃÖ¼Ò°ªÀ» °®´Â ù¹ø° ¸Þ½ÃÁö¸¦ ÀоîµéÀδÙ. ¸¶Áö¸· Àμö flags ´Â Á¦ ¾îÁ¤º¸¸¦ °®°ÔµÈ´Ù. À¯È¿ÇÑ °ªÀ¸·Î´Â IPC_NOWAIT ¿Í MSG_NOERROR °ªÀ» ´Üµ¶À¸ ·Î ȤÀº OR Çؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Ù. MSG_NOERROR °¡ ÁöÁ¤µÈ °æ¿ì, ¸Þ½ÃÁöÀÇ ³»¿ë ÀÌ size º¸´Ù ±æ¸é ÃÊ°úºÐÀ» Á¦°ÅÇÑ´Ù. ÁöÁ¤µÇÁö ¾Ê¾ÒÀ» °æ¿ì¿¡´Â msgrcv °¡ ½ÇÆÐÇÏ°Ô µÈ´Ù. msgctl ½Ã½ºÅÛ È£Ãâ msgctl ¿¡´Â ¼¼°¡Áö ¸ñÀûÀÌ ÀÖ´Ù. À̵éÀº °¢°¢ ÇÁ·Î¼¼½º¿¡°Ô ¸Þ½ÃÁö Å¥ÀÇ »ó ÅÂÁ¤º¸¸¦ ÁÖ°í, ¸Þ½ÃÁö Å¥¿¡ °ü·ÃµÈ Á¦ÇÑ»çÇ×À» º¯°æÇÒ ¼ö ÀÖ°Ô ÇÏ°í, ½Ã½ºÅÛ »ó¿¡¼­ Å¥¸¦ Á¦°ÅÇÒ ¼ö ÀÖ°Ô ÇÏ´Â °ÍÀÌ´Ù. #include #include #include int msg_qid, command, retval; struct msqid_ds msq_stat; . . retval = msgctl(msg_qid, command, &msq_stat ); ¹°·Ð msg_qid ´Â À¯È¿ÇÑ ¸Þ½ÃÁö Å¥ ½Äº°ÀÚÀÌ´Ù. &msq_stat ´Â msgid_ds ±¸Á¶ ¸¦ °®´Â º¯¼öÀÇ ÁÖ¼ÒÀÌ´Ù. ÀÌ ±¸Á¶´Â msg.h ¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇ µÇ¾î ÀÖ´Ù. struct ipc_perm msg_perm; /*ownership/perms*/ ushort msg_qnum; /*no. messages on queue*/ ushort msg_qbytes; /*max. no. bytes for queue*/ ushort msg_lspid; /*pid of last msgsnd*/ ushort msg_lrpid; /*pid of last msgrcv*/ time_t msg_stime; /*last msgsnd time*/ time_t msg_rtime; /*last msgrcv time*/ time_t msg_ctime; /*last change time*/ ipc_perm ±¸Á¶´Â ¾Õ¿¡¼­ ¼³¸íÇßµíÀÌ ¸Þ½ÃÁö Å¥¿Í °ü·ÃµÈ ¼ÒÀ¯±Ç°ú »ç¿ëÇã°¡¸¦ ÀúÀåÇÑ´Ù. msg_ctl ÀÇ command Àμö´Â ¼öÇàµÉ ÀÛ¾÷À» Ç¥½ÃÇÑ´Ù. »ç¿ë °¡´ÉÇÑ °ªÀº 3 °³°¡ Àִµ¥ À̵éÀº IPC ±â´É 3 °³¿¡ ¸ðµÎ Àû¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ °ªµéÀº ipc.h ¿¡ »ó¼ö·Î Á¤ÀǵǾî ÀÖ´Ù. IPC_STAT ¸Þ½ÃÁö Å¥ÀÇ »óÅÂÁ¤º¸¸¦ msg_stat ¿¡ ´ã´Â´Ù. IPC_SET msg_stat ¿¡ ÀÖ´Â Á¤º¸¸¦ ¹ÙÅÁÀ¸·Î ¸Þ½ÃÁö Å¥¿¡ ´ëÇÑ Á¦¾î º¯¼öµéÀÇ °ªÀ» ÁöÁ¤ÇÑ´Ù. IPC_RMID ÀÌ´Â ¸Þ½ÃÁö Å¥¸¦ ½Ã½ºÅÛ¿¡¼­ »èÁ¦ÇÏ°Ô ÇÑ´Ù. 7.3.3. ¼¼¸¶Æ÷¾î ÀÌ·ÐÀû ÇüÅÂÀÇ ¼¼¸¶Æ÷¾î ¼¼¸¶Æ÷¾î sem À̶õ ´ÙÀ½°ú °°Àº ¿¬»êÀÌ Çã¿ëµÈ Á¤¼öÇü º¯¼ö¸¦ ¸»ÇÑ´Ù(p ¿Í v ¶õ À̸§Àº wait ¿Í signal À̶õ ¸»ÀÇ ³×´ú¶õµå¾î¿¡¼­ ³ª¿Â °ÍÀ¸·Î À̶§ signal À̶õ ¹°·Ð UNIX ÀÇ signalÈ£Ãâ°ú´Â ´Ù¸¥ °ÍÀÌ´Ù). p(sem) or wait(sem) if(sem != 0) decrement sem by one else wait until ssem becomes no-zero v(sem) or signal(sem) if( queue of waiting processes not empty) restart first process in wait queue else increment sem by one µÎ ¿¬»êÀº ¸ðµÎ ¿øÀÚÈ­µÇ¾î¾ß ÇÑ´Ù. Áï sem À» º¯°æÇÒ ¼ö ÀÖ´Â ÇÁ·Î¼¼½º´Â ÇÑ ¼ø°£¿¡ ¿ÀÁ÷ Çϳª »ÓÀÌ´Ù. ¼¼¸¶Æ÷¾îÀÇ ÁÁÀº Á¡Àº ´ÙÀ½ÀÇ »ç½ÇÀÌ Ç×»ó ¸¸Á·µÈ´Ù ´Â °ÍÀÌ´Ù. (semaphore's initial value + number of v operations - number of completed p operations) >= 0 À̸¦ ¼¼¸¶Æ÷¾îÀÇ ºÒº¯Æ¯¼º(unvatiant)À̶ó ÇÑ´Ù. Àü»ê °úÇÐÀÚµéÀº ÀÌ·¯ÇÑ ºÒ º¯ Ư¼ºÀ» ¼±È£Çϴµ¥ ÀÌ´Â ÇÁ·Î±×·¥À» ü°èÀûÀÌ°í ¾ö°ÝÇÏ°Ô °ËÁ¤ÇÒ ¼ö ÀÖµµ·Ï Çϱ⠶§¹®ÀÌ´Ù. UNIX ½Ã½ºÅÛ V ¿¡¼­ ±¸ÇöµÈ ¼¼¸¶Æ÷¾î´Â ÀÌ·¯ÇÑ °³³ä¿¡ ±âÃÊÇßÁö¸¸ º¸´Ù ÀÏ¹Ý ÀûÀÎ(±×¸®°í ¾Æ¸¶µµ º¹ÀâÇÑ) ±â´ÉÀ» Á¦°øÇÑ´Ù. ¿ì¼± semget °ú semctl À» »ìÆì º¸ÀÚ. #include #include #include key_t key; int sem_id, nsems, permflags, command; int retval, sem_num; union semun{ int val; struct semid_ds *stat; ushort *array; } ctl_arg; . . sem_id = semget(key, nsems, permflags); retval = semctl(sem_id, sem_num, command, ctl_arg); semget È£ÃâÀº msgget °ú À¯»çÇÏ´Ù. Àμö nsems´Â ¼¼¸¶Æ÷¾î ÁýÇÕ¿¡ ÇÊ¿äÇÑ ¼¼ ¸¶Æ÷¾îÀÇ °¹¼ö¸¦ ³ªÅ¸³½´Ù. semget È£ÃâÀÌ ¼º°øÇÏ¸é ¼¼¸¶Æ÷¾î ÁýÇÕ ½Äº°ÀÚ¶ó´Â ¸Þ½ÃÁö Å¥ ½Äº°ÀÚ¿Í À¯»çÇÑ ¿ªÇÒÀ» ÇÏ´Â °ªÀÌ µ¹¾Æ¿Â´Ù. C ¾ð¾îÀÇ °ü½ÀÀ» µû¶ó ¼­ ¼¼¸¶Æ÷¾î ÁýÇÕ¿¡ ´ëÇÑ Ã¸ÀÚ´Â 0 ºÎÅÍ nsems-1 ±îÁö ÀÖÀ» ¼ö ÀÖ´Ù. ÁýÇÕ ³» ÀÇ °¢ ¼¼¸¶Æ÷¾î´Â ´ÙÀ½°ú °°Àº °ªµéÀ» °®°Ô µÈ´Ù. semval ¼¼¸¶Æ÷¾îÀÇ °ªÀ¸·Î¼­ Ç×»ó ¾ç¼ö°¡ ÁöÁ¤µÈ´Ù. sempid ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇß´ø ÃÖ±ÙÀÇ ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ½Äº°¹øÈ£ÀÌ´Ù. semncnt ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ ÇöÀ纸´Ù Áõ°¡Çϱ⸦ ±â´Ù¸®´Â ÇÁ·Î¼¼½ºÀÇ °¹¼ö semzcnt ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ 0 À¸·Î µÇ±â±îÁö ±â´Ù¸®´Â ÇÁ·Î¼¼½ºÀÇ °¹¼ö Á¤ÀÇ¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ ÇÔ¼ö semctl Àº msgctlº¸´Ù ÈξÀ º¹ÀâÇÏ´Ù. sem_id ´Â À¯È¿ÇÑ ¼¼¸¶Æ÷¾î ½Äº°ÀÚ¶ó¾ß ÇÑ´Ù. command ´Â msgctl ¿¡¼­¿Í °°ÀÌ ¼öÇàÇØ¾ß ÇÒ Á¤È®ÇÑ ±â´ÉÀ» ¸í½ÃÇÑ´Ù. semctl ±â´ÉÄÚµå -------------------------------------------- Ç¥ÁØ IPC ±â´É(semid_ds ±¸Á¶´Â sem.h¿¡ Á¤ÀÇµÊ -------------------------------------------- IPC_STAT »óÅÂÁ¤º¸¸¦ ctl_arg.stat ¿¡ ÀúÀå IPC_SET ctl_arg.stat ¿¡ ÀúÀåµÈ ÇüÅ·Π¼ÒÀ¯ ±Ç°ú »ç¿ë Çã°¡±ÇÀ» ÁöÁ¤ IPC_RMID ½Ã½ºÅÛ¿¡¼­ ÇØ´ç ¼¼¸¶Æ÷¾îÀÇ ÁýÇÕÀ» »èÁ¦ -------------------------------------------- ´ÜÀÏ ¼¼¸¶Æ÷¾î ¿¬»ê ( retval ¿¡¼­ ³Ñ¾î¿Â °ª sem_unm À» »ç¿ë ) -------------------------------------------- GETVAL ¼¼¸¶Æ÷¾îÀÇ °ª semval À» µ¹·ÁÁØ´Ù. SETVAL ¼¼¸¶Æ÷¾î °ªÀ» ctl_arg.val ·Î ÁöÁ¤ GETPID sempid ÀÇ °ªÀ» µ¹·ÁÁØ´Ù. GETNCNT semncnt ¸¦ µ¹·ÁÁØ´Ù. GETZCNT semzcnt ¸¦ µ¹·ÁÁØ´Ù. -------------------------------------------- Àüü ¼¼¸¶Æ÷¾î ¿¬»ê -------------------------------------------- GETALL ¸ðµç senvals ÀÇ °ªÀ» ctl_arg.array ¿¡ ÀúÀåÇÑ´Ù. SETALL ctl_arg.array ÀÇ °ªÀ» »ç¿ëÇÏ¿© ¸ðµç semvals °ªÀ» ÁöÁ¤ÇÑ´Ù. -------------------------------------------- ¼¼¸¶Æ÷¾î ¿¬»ê : semop È£Ãâ semop È£Ãâ semop Àº ±âº»ÀûÀÎ ¼¼¸¶Æ÷¾î ¿¬»êÀ» ½ÇÁ¦·Î ¼öÇàÇÏ´Â ½Ã½ºÅÛÈ£Ãâ ÀÌ´Ù. À̶§ semop Àº ¸Þ´º¾óÀÇ Ç׸ñÀÌ ¾Æ´Ï¶ó ½ÇÁ¦ ÇÔ¼öÀ̸§ÀÌ´Ù. #include #include #include int retval, sem_id; struct sembuf op_array[SOMEVALUE]; . . retval = semop(sem_id, op_array, SOME VALUE); sem_id ´Â ¼¼¸¶Æ÷¾î ÁýÇÔ ½Äº°¾î·Î¼­ ÀÌÀü¿¡ semget È£ÃâÀ» ÅëÇØ °ªÀÌ ÁöÁ¤µÇ ¾î¾ßÇÑ´Ù. op_array ´Â sembuf ±¸Á¶ÀÇ ¹è¿­·Î¼­ sembuf ±¸Á¶´Â sem.h ¿¡ Á¤ÀÇ µÇ¾î ÀÖ´Ù. SOMEVALUE ´Â ÀÓÀÇÀÇ Á¤¼öÇü »ó¼öÀÌ´Ù. °¢°¢ÀÇ sembuf ±¸Á¶ º¯¼ö´Â ¼¼¸¶Æ÷¾î¿¡ ´ëÇØ ¼öÇàÇÒ ¿¬»êÀ» ÁöÁ¤ÇÑ´Ù. sembuf ±¸Á¶¸¦ Á»´õ ÀÚ¼¼È÷ º¸¸é ´Ù À½°ú °°´Ù. short sem_num; short sem_op; short sem_flg; sem_num ´Â ÁýÇÕ ³»ÀÇ ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Ã·ÀÚ¸¦ ÀúÀåÇÑ´Ù. ¸¸¾à ÁýÇÕÀÇ ¿ø¼Ò°¡ Çϳª»ÓÀ̶ó¸é sem_num ÀÇ °ªÀº 0 À̾î¾ßÇÑ´Ù. sem_op ´Â ÇÔ¼ö semop ÀÌ ¼öÇàÇØ ¾ß ÇÏ´Â ±â´ÉÀ» Á¤¼ö·Î¼­ ³ªÅ¸³½´Ù. SEM_UNDO Ç÷¡±× ÀÌ°ÍÀº sembuf ±¸Á¶ÀÇ ±¸¼º¿ä¼Ò sem_flg ¿¡ ÀÖ´Â Ç÷¡±×ÀÇ ÇϳªÀÌ´Ù. ÀÌ´Â ÇÁ·Î¼¼½ºÀÇ ¼öÇàÀÌ ³¡³µÀ» ¶§ ½Ã½ºÅÛÀÌ ¼öÇàµÈ ¿¬»êÀ» ÀÚµ¿ÀûÀ¸·Î Ãë¼ÒÇϵµ·Ï Áö½ÃÇÑ´Ù. 7.3.4. °øÀ¯ ¸Þ¸ð¸® °øÀ¯ ¸Þ¸ð¸® ¿¬»êÀº µÑ ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ½ÇÁ¦ ¸Þ¸ð¸®ÀÇ ÀϺθ¦ °øÀ¯ÇÏ°Ô ÇØ ÁØ´Ù(¹°·Ð º¸ÅëÀÇ °æ¿ì¿¡´Â ¼­·Î ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ Àڷ῵¿ªÀº ¿ÏÀüÈ÷ µ¶¸³ÀûÀÌ ´Ù). ÀÌ ±â¹ýÀº ¼¼°¡Áö IPC ±â´É Áß¿¡¼­ °¡Àå È¿À²ÀûÀÌ´Ù. ¸ðµç °øÀ¯ ¸Þ¸ð¸® ¿¬»êÀº Ưº°ÇÑ Çϵå¿þ¾îÀÇ Áö¿øÀ» ÇÊ¿ä·Î ÇÑ´Ù. sbmget ¿Í shmop ½Ã½ºÅÛ È£Ãâ °øÀ¯ÇÏ´Â ¸Þ¸ð¸® ¿µ¿ªÀº shmget È£ÃâÀ» ÅëÇØ »ý¼ºµÈ´Ù. #include #include #include key_t key; int size, permflags, shm_id; . . shm_id = shmget(key, size, permflags); ÀÌ´Â msgget À̳ª semget °ú ´ëÀÀµÈ´Ù. Àμö size ´Â °øÀ¯ÇÒ ¸Þ¸ð¸® ¿µ¿ªÀÇ ÇÊ¿äÇÑ ÃÖ¼Ò Å©±â¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ³ªÅ¸³½ Ä¿¼­ÀÌ´Ù. key ´Â ¿µ¿ªÀ» ½Äº°Çϱâ À§ÇÑ Å° °ªÀÌ´Ù. permflag ´Â ¸Þ¸ð¸® ¿µ¿ª¿¡ ´ëÇÑ »ç¿ë Çã°¡±ÇÀ¸·Î¼­, msgget À̳ª semget ÀÇ °æ¿ìµÂ °°ÀÌ IPC_CREAT ¿Í IPC_EXCL ¸¦ »ç¿ëÇÏ¿© ÁöÁ¤ÇÒ ¼ö ÀÖ ´Ù. »ý¼º µÇ´Â ¸Þ¸ð¸® ¿µ¿ªÀº ÇÁ·Î¼¼½ºÀÇ ³í¸®Àû ÀÚ·á ¿µ¿ªÀÌ ¾Æ´Ï¶ó ½ÇÁ¦ ¸Þ ¸ð¸®ÀÇ ÀϺÎÀÌ´Ù. #include #include #include int shm_id, shmflags; char *memptr, *daddr, *shmat(); . . memptr = shmat(shm_id, daddr, shmflags); shmat ´Â shm_id °¡ ÁöÁ¤ÇÏ´Â ¸Þ¸ð¸® ¿µ¿ª(shmget È£Ãâ¿¡ ÀÇÇØ ¾ò¾îÁü)°ú È£ Ãâ ÇÁ·Î¼¼½º ÀÇ À¯È¿ÇÑ ÁÖ¼Ò¸¦ ¿¬°ü Áþ´Â´Ù. daddr ´Â È£Ãâ¿¡¼­ ¼±ÅõǴ ÁÖ¼Ò ¸¦ ÇÁ·Î±×·¡¸Ó °¡ Á¦¾îÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. shmflags ÀÇ °ªÀº µÎ °³ÀÇ Ç÷¡±× SHM_RDONLY ¿Í SHM_RND ¸¦ Á¶ÇÕÇÏ ¿© Á¤ÇØÁø´Ù. shmctl ½Ã½ºÅÛ È£Ãâ #include #include #include int shm_id, retval, command; struct shmid_ds shm_stat; . . retval = shmctl(shm_id, command, &shm_stat ); ÀÌ°ÍÀº msgctl °ú Á¤È®È÷ ÀÏÄ¡ÇÑ´Ù. command °¡ ÃëÇÒ ¼ö ÀÖ´Â °ªÀº IPC_STAT, IPC_SET ±×¸®°í IPC_RMID ÀÌ´Ù. 7.3.5. ipcs ¿Í ipcrm ¸í·É IPC ¼³ºñ¸¦ ÀÌ¿ëÇϱâ À§ÇØ ½© ¼öÁØ¿¡¼­´Â µÎ°³ ÀÇ ¸í·É¾î¸¦ Á¦°øÇÑ´Ù. ù°´Â ipcs ·Î¼­ IPC ¼³ºñÀÇ ÇöÀç »óÅ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. µÑ°´Â ipcrm ¸í·ÉÀ¸·Î¼­ ½Ã½ºÅÛ¿¡¼­ IPC °´Ã¼ ¸¦ Á¦°ÅÇϱâ À§ÇØ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î, $ipcrm -s 0 ´Â ½Äº°ÀÚ 0 °ú ¿¬°üµÈ ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÑ´Ù.¶Ç $ipcrm -S 200 ´Â Å°°ªÀÌ 200 ÀÎ ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÑ´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 60¹ø Á¦ ¸ñ:[moohou] Unix System Programming 8 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:41 ÀÐÀ½:3484 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 8 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦8Àå. ´Ü¸»±â 8.1. ¼­·Ð ÇÁ·Î±×·¥°ú »ç¿ëÀÚ°¡ ´Ü¸»±â¸¦ ÅëÇØ ±³½ÅÇÒ ¶§´Â ¾ðÁ¦³ª º¸±âº¸´Ù ÈξÀ ¸¹Àº ÀϵéÀÌ ¹ú¾îÁø´Ù. ¿¹¸¦ µé¾î ÇÁ·Î±×·¥ÀÌ ´Ü¸»±â ÀåÄ¡¿¡ ¹®ÀÚ¿­À» ¾µ ¶§ ÀÌ ¹® ÀÚ¿­Àº ´Ü¸»±â ÀåÄ¡ ±¸µ¿±â¶ó´Â Ä¿³ÎÀÇ ÇѺκп¡ ÀÇÇØ ¿ì¼± 󸮵ȴÙ. ½Ã½ºÅÛ ÀÌ À¯ÁöÇÏ´Â »óÅ Ç÷¡±×°¡ °®´Â °ª¿¡ µû¶ó¼­, ¹®ÀÚ¿­Àº Ãà¾àµÈ ÇüÅ·ΠÀü´ÞµÇ ±âµµ ÇÏ°í ±¸µ¿±â¿¡ ÀÇÇØ º¯ÇüµÇ±âµµ ÇÑ´Ù. - ÇÁ·Î±×·¥ ÀÌ´Â Ãâ·Â ¹®ÀÚ¿­À» »ý¼ºÇÏ°í ÀÔ·Â ¹®ÀÚ¿­À» Çؼ®ÇÑ´Ù. - ´Ü¸»±â ÀåÄ¡ ±¸µ¿±â ÀÌ´Â kernel ÀÇ ÀϺÎ, Áï ¼ÒÇÁÆ®¿þ¾îÀÇ ÀÏÁ¾ÀÌ´Ù. ±¸µ¿±âÀÇ ÁÖ¿äºÎºÐÀº ÄÄÇ»ÅÍ°¡ ´Ü¸»±â¿Í Åë½ÅÇϵµ·Ï ÇØ Áִ ƯÁ¤ Çϵå¿þ¾î¿Í »óÈ£ÀÛ¿ëÀ» ÇÑ´Ù. ´Ü ¸»±â ÀåÄ¡ ±¸µ¿±âÀÇ ÁÖ¿ä ±â´ÉÀº ÇÁ·Î±×·¥°ú ´Ü¸»±â ÀåÄ¡ »çÀÌ¿¡ ÀڷḦ Àü´Þ ÇÏ´Â °ÍÀÌ´Ù. - Å°º¸µå¿Í È­¸é ÀÌµé µÎ ³ëµå´Â ´Ü¸»±â ÀÚü¸¦ ³ªÅ¸³»¸ç ´Ü¸»±â°¡ µÎ°¡Áö Ãø¸éÀ» °®°í ÀÖ À½À» °­Á¶ÇÑ´Ù. ´Ü¸»±âÀÇ Å°º¸µå´Â ÀÔ·Â ÀåÄ¡¿¡ ÇØ´çÇÏ°í È­¸éÀº Ãâ·ÂÀåÄ¡·Î ÀÛµ¿ÇÑ´Ù. µÎ°¡Áö ÁÖÀÇÇÒ Á¡ÀÌ ÀÖ´Ù. ù°, ¿ì¸®´Â UNIX¿¡¼­ »ç¿ëµÇ´Â ´Ü¸»±âÀÇ ´ëºÎºÐ ÀÎ ºñµ¿±â½Ä ´Ü¸»±â ¸¸À» ´Ù·é´Ù. µÑ°, UNIX ³ª ±× º¯Áß¿¡¼­ÀÇ ´Ü¸»±â Á¶ÀÛÀº ¼­·Î ÀÏÄ¡ÇÏÁö ¾Ê´Â °ÍÀ¸·Î ¾Ç¸íÀÌ ³ô´Ù. 8.2. UNIX ´Ü¸»±â Á¦ 4 Àå¿¡¼­ ¾ð±ÞÇßµíÀÌ ´Ü¸»±â´Â Ư¼öÈ­ÀÏ·Î ÀνĵȴÙ. (±×¸®°í ´Ü¸»±âÀÇ Æ¯ ¼º»ó ¹®ÀÚ ÀåÄ¡ ·Î¼­ Ãë±ÞµÈ´Ù). ´Ü¸»±â À̸§À¸·Î´Â ´ÙÀ½ÀÇ °Í µéÀÌ ¸¹ÀÌ ¾²ÀÎ ´Ù. /dev/console /dev/tty01 /dev/tty02 /dev/tty03 tty ´Â ´Ü¸»±â¸¦ ÁöĪÇÏ´Â UNIX ¿ë¾îÀÌ´Ù. 8.2.1. Á¦¾î ´Ü¸»±â ÇÁ·Î¼¼½ºÀÇ Ç¥ÁØ È­ÀÏ ±â¼ú¾î¸¦ ÅëÇÏ¿© Á¢±ÙÇÒ ¼ö ÀÖ´Â ´Ü¸»±â¸¦ ÇÁ·Î¼¼½º¿Í ÇÁ·Î¼¼½º ±×·ìÀÇ Á¦¾î ´Ü¸»±â¶ó ÇÑ´Ù. ÇÁ·Î¼¼½º°¡ ÀÚ½ÅÀÇ È­ÀÏ ±â¼ú¾î »óÅÂ¿Í ¹«°ü ÇÏ°Ô Á¦¾î ´Ü¸»±â¿¡ Á¢±ÙÇÏ·Á¸é /dev/tty ¶õ È­ÀÏÀ̸§À» »ç¿ëÇÏ¸é µÈ´Ù. ÀÌ´Â Ç×»ó ÇÁ·Î¼¼½º ÀÇ ÇöÀç Á¦¾î ´Ü¸»±â¸¦ °¡¸®Å²´Ù. 8.2.2. ÀÚ·áÀü¼Û ´Ü¸»±â ÀåÄ¡ ±¸µ¿±â´Â ÇÁ·Î±×·¥°ú ´Ü¸»±â ÀåÄ¡ »çÀÌ¿¡ ¹®ÀÚ¸¦ Àü´ÞÇÏ´Â °ÍÀÌ ÁÖ ÀÓ¹«ÀÌ´Ù. 8.2.3. ¹ÝÇâ°ú ¹Ì¸® Ãijֱ⠰¡Àå ±âÃÊÀûÀÎ ÆíÀÇ ±â´ÉÀ¸·Î´Â ¹®ÀÚÀÇ ¹ÝÇâ(echoing)À» ²ÅÀ»¼ö ÀÖ´Ù. ÀÌ´Â »ç¿ëÀÚ°¡ Å°º¸µå ¿¡¼­ ¹®ÀÚ 'A' ¸¦ Ä¥¶§ È­¸é¿¡ 'A' °¡ ³ªÅ¸³ª°Ô ÇÏ´Â ±â´ÉÀÌ ´Ù. ÀÌ´Â ÇÁ·Î±×·¥ÀÌ È­¸é¿¡ Ãâ·Â ÇÏ´Â µµÁß¿¡ »ç¿ëÀÚ°¡ ÀÔ·ÂÀ» ÇÏ´Â °æ¿ì¿¡ Ãâ·Â ÀÇ Áß°£¿¡ ÀÔ·ÂÀÇ ¹ÝÇâÀÌ ³ªÅ¸³ª´Â »óȲÀ» ÃÊ·¡ ÇÑ´Ù. ´Ù¸¥ ½Ã½ºÅÛÀÇ °æ ¿ì¿¡´Â ÇÁ·Î±×·¥ÀÌ ÀÔ·Â À» ÀÐÀ» Áغñ¸¦ °®Ãâ ¶§±îÁö ¹ÝÇâÀÌ ¾ïÁ¦µÈ´Ù. 8.2.4. ±ÔÁظðµå, ¶óÀÌÆíÁý, Ư¼ö¹®ÀÚ. UNIX ±¸µ¿±â´Â ´Ü¼øÇÏ°í ¶óÀÎ Áß½ÉÀÌ¸ç ´ëÈ­½ÄÀÎ ¿ëµµ¿¡ Ưº°È÷ ¸ÂÃá ÀÛµ¿ ¸ð µå¸¦ Á¦°øÇÑ´Ù. ÀÌ´Â ±ÔÁØ ¸ðµå(canonical mode)¶ó ÇÏ¸ç ½©À̳ª ed ÆíÁý±â, ±× ¸®°í ±âŸ À¯»çÇÑ ÇÁ·Î±×·¥¿¡¼­ ¸¹ÀÌ »ç¿ëµÈ´Ù. ±ÔÁظðµå¿¡¼­ »ç¿ëµÇ´Â ÆíÁý Å° Áß °¡Àå Ä£¼÷ÇÑ °ÍÀº erase ¹®ÀÚÀÌ´Ù. À̸¦ ´©¸£¸é ÇØ´ç ¶óÀÎÀÇ ¾Õ¼­ÀÇ ¹® ÀÚ°¡ Áö¿öÁø´Ù. $whpo ½© ¼öÁØ¿¡¼­ À̸¦ Á¤ÇÏ´Â ¹æ¹ýÀº stty ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. $stty erase "^h" ´Â erase ¹®Àڷμ­ CTRL-H ¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ´Â backspase ÀÇ ¶Ç ´Ù¸¥ À̸§ÀÌ ´Ù. À̶§ CTRL-H ¹®ÀÚ¸¦ Á÷Á¢ ÀÔ·ÂÇÏÁö ¾Ê¾Æµµ ¹®ÀÚ¿­ '^h' ¸¦ »ç¿ëÇÏ¸é µÈ´Ù ´Â »ç½Ç¿¡ ÁÖ¸ñÇ϶ó. erase, kill, ¶Ç´Â eof ¹®ÀÚÀÇ Æ¯¼ö Àǹ̸¦ Á¦°ÅÇÏ·Á¸é ¹Ù·Î ¾Õ¿¡ ¿ª ½½·¡½¬ ¹®ÀÚ(\)¸¦ »ç¿ëÇÑ´Ù. ÀÌ °æ¿ì¿¡´Â Ư¼ö ¹®ÀÚ¿¡ °áºÎµÈ ±â ´ÉÀÌ ¼öÇàµÇÁö ¾Ê°í ¹®ÀÚ ÀÚü°¡ ÇÁ·Î±×·¥À¸ ·Î Àü´ÞµÈ´Ù. aa\bc Àº ´Ü¸»±â¿¡¼­ ÀÔ·ÂÀ» ¾ò´Â ÇÁ·Î±×·¦¿¡°Ô aa\c ·Î Àü´ÞµÈ´Ù. 8.3. ÇÁ·Î±×·¥ÀÇ °üÁ¡ Áö±ÝºÎÅÍ´Â ´Ü¸»±â¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÇ °üÁ¡¿¡¼­ »ìÆ캸ÀÚ. 8.3.1. open ½Ã½ºÅÛ È£Ãâ open Àº º¸ÅëÀÇ µð½ºÅ© È­ÀÏ°ú ¸Å¿ì À¯»çÇÑ ¹æ¹ýÀ¸·Î ´Ü¸»±â¸¦ °³¹æÇϴµ¥ »ç ¿ëµÈ´Ù. fd = open("/dev/tty0a", O_RDWR); 8.3.2. read ½Ã½ºÅÛ È£Ãâ È­ÀÏ¿¡ Á¢±ÙÇÏ´Â ±âº» È£Ãâ Áß¿¡¼­ ´Ü¸»±â Ư¼ö È­ÀÏÀ» »ç¿ëÇÏ´Â °æ¿ì¿¡ °¡Àå Å« ¿µÇâÀ» ¹Þ´Â °ÍÀÌ read ½Ã½ºÅÛ È£ÃâÀÌ´Ù. read È£ÃâÀº Ç×»ó newline ÀÌ ÀÔ ·ÂµÇ¾î¾ß ³¡³­´Ù. nread = read(0, buffer, 256); 8.3.3. write ½Ã½ºÅÛ È£Ãâ ÀÌ´Â ´Ü¸»±â¿Í ÇÔ±ú »ç¿ëµÇ´Â ÇÑ ¸Å¿ì °£´ÜÇÏ°Ô ¼öÇàµÈ´Ù. ´ÜÁö Á¦ÇÑÁ¢À̶õ ÇØ´ç ´Ü¸»±âÀÇ Ãâ·Â Å¥°¡ ¸ðµÎ Â÷ ÀÖ´Â °æ¿ì¿¡ write °¡ ºí·°µÇ´Â °Í »ÓÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ ¼öÇàÀÌ Àç°³µÇ·Á¸é Å¥¿¡ ³²¾ÆÀÖ´Â ¹®ÀÚµéÀÌ ÀÏÁ¤¼öÁØ ÀÌÇÏ·Î ºüÁ® ³ª°¡¾ß ÇÑ´Ù. 8.3.4. ttyname °ú isatty ttyname Àº °³¹æµÈ ´Ü¸»±â È­ÀÏ ±â¼ú¾îÀÇ ÇØ´ç ´Ü¸»±â ÀåÄ¡¿¡ ´ëÇÑ À̸§À» µ¹ ·ÁÁØ´Ù. isatty ´Â È­ÀÏ ±â¼ú¾î°¡ ´Ü¸»±â ÀåÄ¡ÀÇ °ÍÀ̸é 1 À», ¾Æ´Ï¸é 0 À» µ¹ ·ÁÁØ´Ù. int filedes, bool; char *name, *ttyname(); . . name = ttyname(filedes); bool = isatty(filedes); µÎ±âÁö °æ¿ì ¸ðµÎ filedes ´Â °³¹æµÈ È­ÀÏ ±â¼ú¾î¸¦ ³ªÅ¸³½´Ù. filedes °¡ ´Ü ¸»±â¸¦ ³ªÅ¸³»Áö ¾ÊÀ¸¸é ttynam Àº NULL À» µ¹·ÁÁØ´Ù. 8.3.5. termio ±¸Á¶¸¦ »ç¿ëÇÏ¿© ´Ü¸»±â Ư¼ºÀ» º¯°æÇÏ´Â ¹ý ½©¿¡¼­´Â ´Ü¸»±âÀÇ Æ¯¼ºÀ» º¯°æÇϱâ À§ÇÏ¿© stty ¸í·ÉÀ» »ç¿ëÇß´Ù. ÇÁ·Î±×·¥ ¿¡¼­´Â ioctl ½Ã½ºÅÛ È£Ãâ°ú termino ±¸Á¶¸¦ »ç¿ëÇÏ¿© °°Àº ÀÏÀ» ÇÒ ¼ö ÀÖ´Ù. - »ý·« 8.3.6. MIN °ú TIME Àμö Àμö MIN °ú TIME Àº Ç÷¡±× ICANON ÀÌ 0 À϶§¸¸ È¿·ÂÀ» °®´Â´Ù. À̵éÀº ÀÚ·á ÀÇ ÀÔ·Â, Áï read È£Ãâ¿¡ ´ëÇÑ ÇÁ·Î±×ÀÇ Á¦¾î±ÇÀ» Á¤¹ÐÇÏ°Ô Á¶Á¤ÇÑ´Ù. MIN Àº ´Ü¸»±â¿¡ ´ëÇÑ read È£ÃâÀÌ ³¡³ª±â Àü¿¡ ´Ü¸»±â ±¸µ¿±â°¡ ¹Þ¾Æ µé¿©¾ß ÇÏ´Â ¹® ÀÚÀÇ ÃÖ¼Ò °¹¼ö¸¦ ³ªÅ¸³½´Ù. TIME ´Â ¶Ç ´Ù¸¥ Á¦¾î±ÇÀ¸·Î¼­ ½Ã°£ Á¾·áÀÇ ±â°£ À» ³ªÅ¸ ³½´Ù. MIN °ú TIME ÀÇ °ª¿¡´Â ´ÙÀ½ÀÇ 4 °¡Áö °æ¿ì°¡ ÀÖÀ» ¼ö ÀÖ´Ù. 1. MIN °ú TIME ¸ðµÎ 0 À϶§. ÀÌ ¶§´Â read È£ÃâÀÌ Ç×»ó Áï½Ã ³¡³­´Ù. ÇØ´ç ´Ü¸»±âÀÇ ÀԷ ť¿¡ ¹®ÀÚ°¡ µé ¾î ÀÖÀ¸¸é(ÀÔ·ÂÀº ¾Æ¹«¶§°í µµÂøÇÑ´Ù´Â °ÍÀ» »ó±âÇ϶ó), ÇÁ·Î±×·¥ ¹öÆÛ¿¡ ¿Å °ÜÁø´Ù. 2. MIN Àº 0 º¸´Ù ÄÚ°í TIME Àº 0 °ú °°À»¶§. ÀÌ °æ¿ì¿¡´Â ŸÀ̸Ӱ¡ ¾Æ¹« ¿ªÇÒµµ ÇÏÁö ¾Ê´Â´Ù. read È£ÃâÀÌ ³¡¸¶ÃÄ Áö·Á¸é ÀÐÇôÁö±æ ±â´Ù¸®´Â ¹®ÀÚ°¡ MIN ¸¸Å­Àº ÀÖ¾î¾ß ÇÑ´Ù. 3. MIN Àº 0 ÀÌ°í TIME Àº 0 º¸´Ù Ŭ¶§. ÀÌ °æ¿ì MIN Àº ¾Æ¹«Àϵµ ÇÏÁö ¸øÇÑ´Ù. ŸÀ̸Ӵ read °¡ È£ÃâµÇ´Â ¼ø°£ºÎÅÍ ÀÛµ¿ÇÑ´Ù. 4. MIN °ú TIME ¸ðµÎ 0 º¸´Ù Å« °æ¿ì. ÀÌ °æ¿ì°¡ °¡Àå À¯¿ëÇÏ°íµµ À¯¿¬¼ºÀÌ ÀÖ´Ù. ŸÀ̸Ӱ¡ ÀÛµ¿µÇ´Â ¼ø°£Àº ÀÌÁ¦ ´Â read °¡ È£ÃâµÈ ¼ø°£ÀÌ ¾Æ´Ï¶ó ù¹ø° ¹®ÀÚ°¡ µé¾î¿ÔÀ» ¶§ÀÌ´Ù. ½Ã°£ÀÌ Á¾·áµÇ¸é ±× ¼ø°£±îÁö ÀԷ ť ¿¡ ÀÖ´Â ¹®Àڵ鸸ÀÌ ÇÁ·Î±×·¥¿¡ Àü´ÞµÈ´Ù. 8.3.7. ioctl ½Ã½ºÅÛ È£Ãâ ioctl Àº ¹®ÀÚÇü Ư¼ö È­ÀÏÀÌ ³ªÅ¸³»´Â ¿ÜºÎÀåÄ¡¸¦ Á¦¾îÇϱâ À§ÇÑ ´Ù¸ñÀû È£ Ãâ·Î¼­ ÀμöÀÇ À¯ÇüÀÌ ¸Å¿ì ´Ù¾çÇÏ´Ù. ´Ü¸»±â¿¡ ´ëÇÑ ioctl È£ÃâÀº Å©°Ô ±âº» È£Ãâ°ú Ãß°¡È£ÃâÀÇ µÎ°¡Áö À¯ÇüÀ¸·Î ºÐ¸®µÈ´Ù. ±âº»È£ÃâÀÇ »ç¿ë¹ýÀº ´ÙÀ½°ú °° ´Ù. #include struct termio targ; int ttyfd, cmd, retval; . . retval = ioctl(ttyfd, cmd, &targ); ttyfd ´Â ´Ü¸»±â¿¡ ´ëÇÑ °³¹æµÈ È­ÀÏ ±â¼ú¾î¶ó¾ß ÇÑ´Ù. targ ´Â termio ±¸Á¶ ÀÇ º¯¼· ´Ü¸»±âÀÇ »óŸ¦ ÀúÀåÇÑ´Ù. Àμö cmd ´Â ioctl ÀÇ ¼öÇà¾ç½ÄÀ» ÁöÁ¤ÇÏ ¸ç termio.h ¿¡ Á¤ÀÇµÈ ¹Ù¿Í °°ÀÌ ´ÙÀ½°ú °°Àº °ªÀ» °¡Áú ¼ö ÀÖ´Ù. TCGETA ÀÌ´Â icctl ÀÌ ´Ü¸»±âÀÇ ÇöÀç»óŸ¦ targ ¿¡ º¹»çÇÏ°Ô ÇÑ´Ù. TCSETA TCGETA ÀÇ ¿ªÀ¸·Î¼­, targ ¿¡ ÀÖ´Â °ªÀ¸·Î ´Ü¸»±âÀÇ »óŸ¦ ÁöÁ¤ÇÑ´Ù. TCSETAW ÀÌ´Â TCSETA ¿Í °°Àº ±â´ÉÀ» ÇÏÁö¸¸ »õ·Î¿î °ªÀ» ÁöÁ¤ÇϱâÀü¿¡ ÇöÀçÀÇ Ãâ·Â Å¥°¡ ºñ¿öÁú ¶§±îÁö ±â´Ù¸°´Ù. TCSETAF ÀÌ´Â TCSETA ÀÇ ¶Ç ´Ù¸¥ ÇüÅ·μ­ Ãâ·Â Å¥°¡ ºñ¿öÁú ¶§±îÁö ±â´Ù¸° ÈÄ¿¡ ÀÔ ·Â Å¥¸¦ û¼ÒÇÏ°í ³­ ´ÙÀ½¿¡¾ß ´Ü¸»±âÀÇ »óŸ¦ targ ÀÇ °ªÀ¸·Î ÁöÁ¤ÇÑ´Ù. ÀÌ´Â ±âº» È£Ãâ°ú Ãß°¡ È£Ãâ °æ¿ì¿¡ ¸ðµÎ Àû¿ëµÈ´Ù. Ãß°¡ÀûÀÎ ioctl È£ÃâÀº ÇÁ·Î±×·¡¸Ó¿¡°Ô ´Ü¸»±â ±¸µ¿±â°¡ °ü¸®ÇÏ´Â ÀÔÃâ·Â Å¥¿¡ ´ëÇÑ ¾î´À Á¤µµÀÇ Á¦¾î ±ÇÀ» ºÎ¿©ÇÑ´Ù. #include int ttyfd, cmd, arg, retval; . . retval = ioctl(ttyfd, cmd, arg); ¿©±â¼­ ttyfd ¿Í cmd ÀÇ Àǹ̴ ¾Õ¿¡¼­ÀÇ °æ¿ì µ¿ÀÏÇÏ´Ù. arg ´Â Á¤¼öÇü·Î Ãß °¡ÀûÀÎ Á¤º¸¸¦ Àü´ÞÇÑ´Ù. Ãß°¡ ioctl È£Ãâ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â cmd ÀÇ °ªÀº ´Ù À½°ú °°´Ù. TCFLSH arg °¡ 0 À̸é ÀԷ ť¸¦ û¼ÒÇÑ´Ù. Áï ÀԷ ťÀÇ ¸ðµç ¹®ÀÚ¸¦ ¹«½ÃÇÑ´Ù. arg °¡ 1 À̸é Å¥¸¦ û¼ÒÇÑ´Ù. arg °¡ 2 À̸é ÀÔÃâ·Â Å¥¸¦ ¸ðµÎ û¼ÒÇÑ´Ù. TCXONC ÀÌ°ÍÀº ´Ü¸»±â ±¸µ¿±â¿¡ ´ëÇÑ Áß´Ü/Àç°³¸¦ Á¦¾îÇÑ´Ù. arg °¡ 0 ¸é Ãâ·ÂÀÌ ÁߴܵȴÙ. Áß´ÜµÈ Ãâ·ÂÀ» Àç°³ÇÏ·Á¸é arg °ªÀ» 1 ·Î Çؼ­ ioctl À» ´Ù½Ã È£ ÃâÇØ¾ß ÇÑ´Ù. TCBRK ÀÌ°ÍÀº break ¸¦ Àü¼ÛÇÏ´Â µ¥ »ç¿ëµÈ´Ù. ÀÌ°ÍÀº 1/4 Ãʵ¿¾È 0 ºñÆ®µéÀ» Àü ¼ÛÇÏ´Â °Í°ú °°´Ù. ÀÌ ±â´ÉÀº Ãâ·Â Å¥°¡ ºó ´ÙÀ½¿¡¸¸ »ç¿ëµÇ¾î¾ß ÇÑ´Ù. 8.3.8. ´ÜÀý ½Ã±×³Î 6 Àå¿¡¼­ ÇÁ·Î¼¼½º ±×·ì ¸®´õ°¡ Á¦¾î ´Ü¸»±â¸¦ °®°í ÀÖÀ» ¶§ ¼öÇàÀÌ Á¾·áµÇ¸é ÇØ´ç ÇÁ·Î¼¼½º±×·ìÀÇ ±¸¼º¿øµé¿¡°Ô ´ÜÀý ½Ã±×³Î SIGHUP ÀÌ Àü´ÞµÊÀ» º¸¾Ò´Ù. ¿©±â¿¡´Â ¶Ç ´Ù¸¥ ¿ëµµ°¡ À־, ÄÄÇ»ÅÍ¿Í ´Ü¸»±â »çÀÌÀÇ Á¢¼ÓÀÌ ²÷¾îÁ®¼­ ´Ü ¸»±â ¶óÀÎÀÇ ¹Ý¼ÛÆÄ°¡ °ËÃâµÇÁö ¾Ê´Â »óȲÀ» ´ëº¯ ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ »óȲÀº ´Ü¸»±â°¡ ÀüÈ­¼±À̳ª Áö¿ª ³×Æ®¿öÅ©¸¦ »ç¿ëÇÏ¿© ¿¬°áµÈ °æ¿ì¿¡ ¹ß»ýÇÒ ¼ö ÀÖ ´Ù. ÀÌ·± »óȲÀÌ ¹ß»ýÇϸé, ´Ü¸»±â ±¸µ¿±â´Â ÇØ´ç ´Ü¸»±â¸¦ Á¦¾î ´Ü¸»±â·Î ÇÏ ´Â ¸ðµç ÇÁ·Î¼¼½º¿¡°Ô SIGHUP À» º¸³½´Ù. (SIGINT¿Í´Â ´Þ¸® SIGHUP Àº ½©À» Á¤ »óÀûÀ¸·Î ·Î±×¾Æ¿ôµÇ°Ô ÇÑ´Ù.) º¸ÅëÀÇ °æ¿ì ÇÁ·Î±×·¡¸Ó´Â SIGHUP ¿¡ ¼Õ´ëÁö ¸» ¾Æ¾ß ÇÑ´Ù. ÀÌ´Â ÈǸ¢ÇÑ ¾ÈÀüÀåÄ¡¸¦ Á¦°øÇÑ´Ù. ±×·¯³ª ¶§¿¡ µû¶ó¼­´Â ÇÁ·Î±×·¥ ÀÌ À̸¦ Æ÷ÂøÇÏ¿© ¸¶¹«¸® ÀÛ¾÷À» ¼öÇàÇØ¾ß ÇÒ Çʿ伺ÀÌ ÀÖÀ» ¼ö ÀÖ´Ù. 8.4. connect ÀÇ ¿¹ connect ´Â Åë½Å ÇÁ·Î±×·¥À¸·Î¼­ µÎ°¡Áö ÀÛµ¿¸ðµå¸¦ °®´Â´Ù. Çϳª´Â »ç¿ëÀÚ°¡ µÎ °³ÀÇ UNIX ÄÄÇ»Å͸¦ ¿¬°áÇÏ°Ô ÇØÁØ´Ù. ´Ù¸¥ Çϳª´Â µÎ ÄÄÇ»ÅÍ °£¿¡ ÅؽºÆ® È­ÀÏÀ» Àü¼ÛÇÏ°Ô ÇØÁØ´Ù. ¿ì¼± Çì´õÈ­ÀÏ connect.h ¸¦ »ìÆ캸ÀÚ. ÀÌ È­ÀÏÀº ´Ù ½Ã termio.h ¿Í °°Àº ½Ã½ºÅÛ Çì´õ È­ÀÏÀ» Æ÷ÇÔÇÑ´Ù. ÀÌ¿Ü¿¡µµ ´Ù¼öÀÇ »ó¼ö°¡ Á¤ÀÇ µÇ¾î ÀÖ´Ù. ÀÌ Áß¿¡¼­ STARTCOM À̶õ ¹®ÀÚ¿­Àº ÇöÁö ÄÄÇ»ÅÍ¿¡¼­ ¿ø°Ý ÄÄ Ç»ÅÍ·ÎÀÇ ÀÚ·áÀü´ÞÀ» ÃʱâÈ­ Çϴµ¥ »ç¿ëµÈ´Ù. /* header file for connect program */ #include #include #include #include #include #define ERROR (-1) #define SUCCESS 0 #define TRUE 1 #define FALSE 0 #define SENDFILE 1 #define EXIT 2 #define MAXTIME 30 /*1/10ths sec*/ #define STARTCOM\ "mesg n; stty -opost; cat -> %s; stty opost; mesg y" #define CTRLD 004 /*Control-D*/ #define CTRLP 020 /*Control-P*/ #define CTRLY 031 /*Control-y*/ connect ÇÁ·Î±×·¥À» È£Ãâ ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ¸í·ÉÀ» ÁØ´Ù. $connect term-name speed ¿¹¸¦ µé¾î¼­ $connect /dev/ttya 9600 main ¿¡¼­ È£ÃâÇÏ´Â ÇÔ¼ö·Î´Â Ç¥ÁؽýºÅÛ È£Ãâ °ú ¶óÀ̺귯¸®·çƾÀ» Á¦¿ÜÇÏ ¸é, getspeed, ttyopen, cfatal, ±×¸®°í connect µîÀÌ ÀÖ´Ù. ÇÔ¼ö getspeed ´Â ¸í·É¾î ¶óÀÎ ÀμöÀÇ µÎ ¹ø° °ÍÀ» ioctl ¿¡ ÀûÇÕÇÑ ÇüÅ·Πº¯È¯ÇÑ´Ù. ttyopen Àº ¾Õ¼­ ¼Ò°³ÇßµíÀÌ ´Ü¸»±â¸¦ °³¹æÇÏ´Â ÇÔ¼öÀÌ´Ù(ttyopen À» ¼öÁ¤ÇÏ¿© connect.h ¿¡ Á¤ÀÇµÈ »ó¼öµéÀ» ÀÌ¿ëÇÏ´Â °Íµµ °í·ÁÇغ¸¶ó). ÇÔ¼ö cfatal Àº ¿À ·ù¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í ÇÁ·Î±×·¥ÀÇ ¼öÇàÀ» ÁߴܽÃŲ´Ù. connect ´Â main ÀÌ È£Ãâ ÇÏ´Â ¸¶Áö¸· ÇÔ¼öÀÌ´Ù. ¿©±â¼­´Â µÎ°³ÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ¿© È­ÀÏ Àü¼Û À» ´ã´çÇÏ ´Â ÁßÃßÀû ¿ªÇÒÀ» ÇÑ´Ù. ÇÔ¼ö connect ´Â µÎ°³ÀÇ Àμö°¡ Àִµ¥ ÇÏ ³ª´Â ttyopen ÀÌ °³¹æÇÑ È­Àϱâ¼ú¾îÀÌ°í, ´Ù¸¥ Çϳª ´Â getspeed °¡ º¯È¯ÇØ ÁØ Àü¼Û¼ÓµµÀÌ´Ù. ÀÓ¹« ´Â ÇÁ·Î¼¼½º¸¦ µÎ°³ »ý¼ºÇÏ¿© ºÎ¸ð ÇÁ·Î¼¼½º´Â ¿ø°Ý ½Ã½º ÅÛ¿¡¼­ ¿À´Â ¹®ÀÚµéÀ» Àü´ÞÇÏ°Ô ÇÏ°í ÀÚ½Ä ÇÁ·Î¼¼½º´Â ¿ø°Ý ½Ã½ºÅÛ¿¡¼­ ¿À´Â ¹®ÀÚµé À» ¹Þ¾ÆµéÀÌ°Ô ÇÏ´Â °ÍÀÌ´Ù. ÇÊ¿äÇÑ °æ¿ì¿¡´Â ¿ø°Ý ½Ã½ºÅÛÀ¸·Î È­ÀÏ Àü ¼ÛÀ» °³½ÃÇÒ ¼öµµ ÀÖ´Ù. ¿©±â¼­ ¸í½ÉÇÒ »ç½ÇÀÌ ÀÖ´Ù. Çϳª´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¼öÇàÇÏ´Â from ÇÔ¼ö´Â Àý´ë´Â ³¡³ªÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù. µû¶ó¼­ ºÎ¸ð ÇÁ·Î¼¼½º °¡ kill ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ´Ù¸¥ Çϳª´Â ÇÔ¼ö to °¡ µ¹·ÁÁÖ´Â º¯¼ö status ´Â »ç¿ëÀÚ°¡ ÀÔ·Â ÇÏ´Â ¸í·É¾î¿¡ ÇØ´çÇÑ´Ù´Â °ÍÀÌ´Ù. SENDFILE °ú EXIT °¡ Á¤ ÀÇµÈ °÷Àº ¹°·Ð connect.h ÀÌ´Ù. 8.5. °ú°Å UNIX ¹öÀü 7 °ú °°Àº °æ¿ì¿¡´Â termio ±¸Á¶´Â Á¸ÀçÇÏÁö ¾Ê¾Ò´Ù. ´ë½Å¿¡ ´Ü¸» ±âÀÇ »óŸ¦ ±â¼úÇϱâ À§Çؼ­ º¸´Ù °£´ÙÇÑ ±¸Á¶ sgttyb ¸¦ »ç¿ëÇß´Ù. ÀÌ ±¸Á¶ ÀÇ ÀÚ·áÇüÀ» »ç¿ëÇßÀ»¶§´Â ioctl ÀÇ ±â´ÉÀÌ Á» ´õ Á¦ÇѵǾú¾ú´Ù. ´Ü¸»±âÀÇ Æ¯ ¼ºÀº gtty ¶ó´Â ½Ã½ºÅÛ È£Ãâ¿¡ ÀÇÇØ ¾ò¾îÁö°í stty ¿¡ ÀÇÇØ ÁöÁ¤µÇ¾ú´Ù. 8.6. ±×¸®°í ¹Ì·¡ ½ºÆ®¸²À̶õ º»ÁúÀûÀ¸·Î´Â ÇÁ·Î¼¼½Ì ¸ðµâÀÇ ¼±Çü ±¸Á¶·Î¼­ ½©ÀÇ ÆÄÀÌÇÁ ¶óÀΰú À¯»çÇÏÁö¸¸ ¸ðµâ »çÀÌÀÇ ÀÚ·áÀü´ÞÀÌ ¾ç¹æÇâÀ¸·Î ¸ðµÎ µÉ ¼ö ÀÖ´Â Á¡ÀÌ ´Ù¸£´Ù. ½ºÆ®¸²ÀÇ ÇÑÂÊ ³¡Àº »ç¿ëÀÚ ÇÁ·Î¼¼½º¿¡°Ô ¿¬°áµÇ¾î ÀÖ°í ´Ù¸¥ÂÊ ³¡Àº ½ºÆ®¸³À» À§ÇÑ ÀåÄ¡ ±¸µ¿±â¿¡ ¿¬°áµÈ´Ù. »ç¿ëÀÚ ÇÁ·Î¼¼½º¿¡°Ô °¡Àå °¡±î¿î ¸ðµâÀº ½ºÆ® ¸²¿¡ ´ëÇÑ ÇÁ·Î±×·¡¸ÓÀÇ ÀÎÅÍÆäÀ̽º ¿ªÇÒÀ» ÇÑ´Ù. »ç¿ëÀÚ ÇÁ·Î¼¼½º°¡ write ¸¦ È£ÃâÇϸé ÀÌ´Â ½ºÆ®¸²¿¡ Àü´ÞµÇ´Â ¸Þ½ÃÁö·Î º¯È¯µÇ°í, read ¸¦ È£ÃâµÇ¸é °¡Àå °¡±î¿î ¸ðµâ¿¡¼­ ÀڷḦ ÀÐ¾î µéÀÌ°Ô µÈ´Ù. ÀÏ°ü¼ºÀ» À¯ÁöÇϱâ À§Çؼ­ Á¦¾î Á¤ º¸µµ ¸ðµâ°£ÀÇ ¸Þ½ÃÁö¿Í °°Àº ÇüÅ·ΠÀü´ÞµÈ´Ù. ½ºÆ®¸²ÀÌ open È£ÃâÀ» ÅëÇØ °³ ¹æµÇ¸é µÎ°³ÀÇ ¸»´Ü ¸ðµâÀÌ ÀÚµ¿ÀûÀ¸·Î ¿¬°áµÈ´Ù. ÀÌ°ÍÀÌ ½ºÆ®¸²ÀÇ °¡Àå ±âº» ÀûÀÎ ÇüÅÂÀ̸ç ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸Å¿ì ¿ø½ÃÀûÀÎ ¼öÁØÀÇ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. Ãß°¡ÀûÀÎ ¸ðµâÀÌ ½ºÆ®¸²¿¡ »ðÀԵǷÁ¸é È®ÀåµÈ ÇüÅÂÀÇ ioctl À» È£ÃâÇØ¾ß ÇÑ ´Ù.(´Ü¸»±â°¡ ÃÖÃÊ¿¡ ¸Å¿ì ¿ø½ÃÀû »óÅ·Π°³¹æµÈ´Ù´Â »ç½ÇÀº »ç¿ëÀÚ ¼öÁØÀÇ ÄÚ µå¸¦ ¾à°£ ¼öÁ¤ÇÏ°Ô ¸¸µç´Ù.) ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 61¹ø Á¦ ¸ñ:[moohou] Unix System Programming 9 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:42 ÀÐÀ½:3446 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 9 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦9Àå. Ç¥ÁØ I/O ¶óÀ̺귯¸® 9.1. ¼­·Ð ¿ì¼± Dennis Ritche °¡ ÃÖÃÊ·Î °³¹ßÇÏ°í, ¸ðµç UNIX ½Ã½ºÅÛ¿¡¼­ Á¦°øµÇ´Â C ¶óÀ̺귯¸®ÀÇ Áß¿äÇÑ ºÎºÐÀΠǥÁØ I/O ¶óÀ̺귯¸®¸¦ »ìÆ캻´Ù. Ç¥ÁØ I/O ·éƾ µéÀº UNIX ÀÇ Æ¯Á¤ÇÑ Æ¯¼º¿¡ ¸Å¾î ÀÖÁö ¾Ê°í C ¾ð¾î¸¦ À§ÇÑ ANSI Ç¥ÁØÀÇ ÀϺΠºÐÀÌ µÈ´Ù´Â Àǹ̿¡¼­ À̽İ¡´ÉÇÏ´Ù. Á¦´ë·Î µÈ C ÄÄÆÄÀÏ·¯¶ó¸é ¿î¿µÃ¼Á¦¿¡ °ü °è¾øÀÌ Ç¥ÁØ I/O ¶óÀ̺귯¸®ÀÇ ¿ÏÀüÇÑ ±¸ÇöÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô ÇÒ °ÍÀÌ´Ù. ¾ÕÀ¸ ·Î ¶óÀ̺귯¸®ÀÇ UNIX ±¸Çö°ú Ư¼º, ½Ã½ºÅÛ ÇÁ·Î±×·¡¸Ó¿Í ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚ¸¦ À§ÇÑ À¯¿ë¼º¿¡ ´ëÇÏ¿© »ìÆ캸ÀÚ. 9.2. ½ºÆ®¸²°ú FILE ±¸Á¶ Ç¥ÁØ I/O ·çƾµéÀº ½ºÆ®¸²À̶ó°í ÇÏ´Â ¿£Æ¼Æ¼(entity)¸¦ ÅëÇØ È­ÀÏ¿¡ Á¢±ÙÇÑ ´Ù. º»ÁúÀûÀ¸·Î ÇϳªÀÇ ½ºÆ®¸²Àº ÇÁ·Î±×·¥°ú °³¹æ È­ÀÏ»çÀÌÀÇ ÀÚ·áÀÇ È帧ÀÌ ´Ù. ÇÁ·Î±×·¥³»¿¡¼­ ½ºÆ®¸²Àº FILE ÇüÀÇ ±¸Á¶¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿¡ ÀÇÇØ ½Äº°µÈ´Ù. FILE ÀÇ Á¤ÀǴ ǥÁØ Çì´õ È­ÀÏ stdio.h ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. typedef struct _iobuf { int _cnt; unsigned char *_ptr; unsigned char *_base; char _flag; char _file; } FILE; _file Àº char ·Î¼­ ¼±¾ðµÇ¾úÀ¸³ª ½ÇÁ¦·Î´Â 'ÀÛÀº' ÇÑ ¹ÙÀÌÆ® Á¤¼ö·Î¼­ Ãë±Þ µÈ´Ù. ÀÌ°ÍÀº FILE ±¸Á¶¿¡ ÀÇÇØ ½Äº°µÇ´Â ½ºÆ®¸²ÀÌ È­ÀÏ°ú ¿¬°áµÉ¶§ È­ÀÏ ±â¼ú ¾î¸¦ ³ªÅ¸³¾ °ÍÀÌ´Ù. ÀÌ°ÍÀº Ç¥ÁØ I/O °¡ ±Ã±ØÀûÀ¸·Î È­ÀÏ Á¢±Ù ÇÁ¸®¹ÌƼºê open, read, write, close µîÀ» »ç¿ëÇÑ´Ù´Â »ç½ÇÀ» ¸í½ÃÀûÀ¸·Î ³ªÅ¸³»´Â °ÍÀÌ ´Ù. ±×°ÍÀº Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ ÀÇÇÑ ³»ºÎÀû »ç¿ëÀ» À§ÇÑ °ÍÀÌ´Ù. _flag ´Â ½ºÆ®¸²À» À§ÇÑ Á¦¾îÁ¤º¸¸¦ Æ÷ÇÔÇÑ´Ù. ¿¹¸¦µé¾î ÀÌ°ÍÀº Ç¥ÁØ I/O ¶óÀ̺귯¸®°¡ ÇØ´ç ½ºÆ®¸²ÀÌ ¾²±â, Àб⠶Ǵ µÑ´Ù¸¦ À§ÇØ °³¹æµÈ °ÍÀÎÁö¸¦ ³ªÅ¸³½´Ù. _ptr, _cnt ¿Í _base ´Â °³¹æ ½ºÆ®¸²°ú °ü·ÃµÈ ¹®ÀÚ ¹öÆÛ¸¦ ³ªÅ¸³½´Ù. _base ´Â ¹öÆÛ ÀÇ ½ÃÀÛÁ¡ À» °¡¸®Å²´Ù. _ptr Àº 󸮸¦ À§ÇØ »ç¿ë°¡´ÉÇÑ ¹öÆÛÀÇ ´ÙÀ½ ¹®ÀÚ¸¦ °¡¸®Å°°í, Á¤¼ö _cnt ´Â _ptr °¡ ³ªÅ¸³»´Â À§Ä¡ ÀÌÈÄ¿¡ ¹öÆÛ¿¡ ³²¾ÆÀÖ´Â ¹®ÀÚ ÀÇ ¼ö¸¦ ³ªÅ¸³½´Ù. ¹öÆÛÀÇ Å©±â´Â BUFSIZ ¹ÙÀÌÆ®°¡ µÈ´Ù. BUFSIZ ÀÚü´Â stdio.h ¿¡ Á¤ÀÇ µÇ¾î ÀÖ°í, 2 Àå¿¡¼­ º¸¾ÒµíÀÌ È£½ºÆ®È¯°æÀ» À§ÇÑ µð½ºÅ© ºí ·°Å· ¿ä¼Ò¸¦ Á¤ÇØÁØ´Ù. ÀüÇüÀûÀÎ °ªÀº 512 ¿Í 1024 µîÀÌ´Ù. 9.3. ½ºÆ®¸²À» ¿­°í ´Ý±â : fopen °ú fclose #include FILE *stream; char *filename, *type; int retval; . . stream = fopen(filename, type); retval = fclose(stream); fopen °ú fclose ´Â open °ú close ¿¡ ÇØ´çÇϴ ǥÁØ I/O ¶óÀ̺귯¸®ÀÌ´Ù. fopen ·çƾÀº filename ¿¡ ÀÇÇØ ½Äº°µÇ´Â È­ÀÏÀ» °³¹æÇÏ°í, ÇϳªÀÇ filename °ú °ü·ÃµÇ°Ô ÇÑ´Ù. ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é fopen Àº °³¹æ½ºÆ®¸²À» ½Äº°Çϱâ À§ÇÑ FILE ±¸Á¶¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. fclose ´Â È­ÀÏ°ú stream ¿¡ ÀÇÇØ ½Äº° µÈ ½ºÆ®¸²À» ´Ý°í, ½ºÆ®¸²ÀÌ Ãâ·Â ½ºÆ®¸²ÀÌ¸é ±× ½ºÆ®¸²ÀÇ ¹öÆÛ¿¡ ³²¾ÆÀÖ´Â ¸ð µç ÀڷḦ Ãâ·ÂÇÑ´Ù. fopen ÀÇ µÎ¹ø° Àμö´Â Á¢±ÙÀÇ ¸ðµå¸¦ °áÁ¤ÇÏ´Â ¹®ÀÚ¿­ ÀÌ´Ù. ÀÌ°ÍÀº ´ÙÀ½ÀÇ ±âº»ÀûÀÎ °ªÀ» °¡Áú ¼ö ÀÖ´Ù. r fopen Àº Àбâ Àü¿ëÀ¸·Î °³¹æÇÑ´Ù.(¸¸¾à È­ÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é fopen È£ÃâÀº ½ÇÆÐÇÏ°í NULL À» µ¹·ÁÁØ´Ù.) w filename À» »ý¼ºÇϰųª Àý´Ü(truncate)ÇÏ°í, ¾²±â Àü¿ëÀ¸·Î °³¹æÇÑ´Ù. a Àбâ Àü¿ëÀ¸·Î filename À» °³¹æÇÏ°í ¾²¿©Áö´Â ¸ðµç ÀÚ·á´Â ÀÚµ¿ÀûÀ¸·Î ±× È­ÀÏÀÇ ³¡¿¡ ÷°¡µÈ´Ù. È­ÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é ¾²±â¸¦ À§ÇØ È­ÀÏÀ» »ý¼ºÇÑ´Ù. ÇϳªÀÇ È­ÀÏÀº °»½ÅÀ» À§ÇØ °³¹æµÉ ¼öµµ ÀÖ´Ù. ÀÌ°ÍÀº ±× È­ÀÏ¿¡ ¾²±â¿Í ¸ðµÎ ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. °»½Å¸ðµå´Â open ¿¡ Àü´ÞµÇ´Â type ¸Å°³ º¯¼ö¿¡ Ãß°¡ÀûÀÎ '+' ±âÈ£¸¦ »ç¿ëÇÏ¿© ³ªÅ¸³»¾îÁø´Ù. r+ °»½ÅÀ» À§ÇØ filename À» °³¹æÇÑ´Ù. ±× È­ÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é fopen Àº ½ÇÆÐÇÑ´Ù. w+ filename À» »ý¼º ¶Ç´Â Àý´ÜÇÑ´Ù. ±×¸®°í ±× È­ÀÏÀ» °»½ÅÀ» À§ÇØ °³¹æÇÑ ´Ù. a+ °»½ÅÀ» À§ÇØ °³¹æÇÑ´Ù. ÀÚ·á´Â È­ÀÏÀÇ ³¡¿¡ ÷°¡µÈ´Ù. ÈÀÏÀ Á¸ÀçÇÏÁö ¾Ê À¸¸é È­ÀÏÀº ¾²±â¸¦ À§ÇØ »ý¼ºµÈ´Ù. 9.4. ´ÜÀϹ®ÀÚ I/O : getc ¿Í putc #include FILE *inf, *outf; int c; . . c = getc(inf); putc(c, outf); Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ ÀÇÇØ Á¦°øµÇ´Â °¡Àå °£´ÜÇÑ ÀԷ°ú Ãâ·Â ·çƾÀº getc ¿Í putc ÀÌ´Ù. getc ·çƾÀº ÀÔ·Â ½ºÆ®¸² inf ·Î ºÎÅÍ ´ÙÀ½ ¹®ÀÚ(Á»´õ Àû´çÇÏ°Ô ¸»ÇÏ¸é ´ÙÀ½ ¹ÙÀÌÆ®)¸¦ µ¹·ÁÁØ´Ù. putc ´Â outf ½ºÆ®¸²¿¡ ÇϳªÀÇ ¹®ÀÚ¸¦ Ãâ·Â ÇÑ´Ù. 9.5. ½ºÆ®¸²¿¡ ¹®ÀÚµéÀ» µÇµ¹¸®±â : ungetc #include FILE *stream; int c, retval; . . retval = ungetc(c, stream); ungetc ´Â ÀÔ·Â ½ºÆ®¸²¿¡ ¹®ÀÚ c ¸¦ µÇµ¹·Á ÁØ´Ù. ÀÌ°ÍÀº ³í¸®ÀûÀÎ ¿¬»êÀÌ°í ÀÔ·ÂÈ­ÀÏ ÀÚü ´Â º¯°æµÇÁö ¾Ê´Â´Ù. Çѹø¿¡ ¿ÀÁ÷ ÇϳªÀÇ ¹®ÀÚ ¸¸À» µÇµ¹¸± ¼ö ÀÖ´Ù. 9.6. Ç¥ÁØ ÀÔ·Â, Ç¥ÁØ Ãâ·Â °ú Ç¥ÁØ ¿À·ù Ç¥ÁØ I/O ¶óÀ̺귯¸®´Â Ç¥ÁØ ÀÔ·Â, Ç¥ÁØ Ãâ·Â°ú Ç¥ÁØ ¿À·ù¿¡ ¿¬°áµÈ ¼¼°¡Áö ½ºÆ®¸²À» Á¦°øÇÑ´Ù. ÀÌ·¯ÇÑ Ç¥ÁØ ½ºÆ®¸²µéÀº °³¹æµÉ ÇÊ¿ä°¡ ¾ø´Ù. ´ÙÀ½ÀÇ FILE Æ÷ÀÎÅÍ¿¡ ÀÇÇØ ½Äº°µÈ´Ù. stdin Ç¥ÁØÀÔ·ÂÀÇ FILE Æ÷ÀÎÅÍ stdout Ç¥ÁØÃâ·ÂÀÇ FILE Æ÷ÀÎÅÍ stderr Ç¥ÁØ¿À·ùÀÇ FILE Æ÷ÀÎÅÍ ´ÙÀ½ ¹®ÀåÀº stdin ¿¡¼­ ´ÙÀ½ ¹®ÀÚ¸¦ °¡Á®¿Â´Ù. inchar = getc(stdin); stdin °ú stdout Àº ¾ÆÁÖ ÀÚÁÖ »ç¿ëµÇ±â ¶§¹®¿¡ getc ¿Í putc ÀÇ Ãà¾àÇüÀÎ getchar ¿Í putchar ÀÌ Á¦°øµÈ´Ù. getchar ´Â stdin À¸·Î ºÎÅÍ ´ÙÀ½ ¹®ÀÚ¸¦ ÀÐ ¾î¿À°í putchar ´Â stdout À¸·Î ÇϳªÀÇ ¹®ÀÚ¸¦ º¸³½´Ù. ÇÔ¼ö getchar ¿Í putchar ´Â ¸Å°³ º¯¼ö·Î¼­ FILE Æ÷ÀÎÅ͸¦ °®Áö ¾Ê´Â´Ù. 9.7. Ç¥ÁØ I/O »óÅ ·çƾ ½ºÆ®¸²À¸ »óŸ¦ ¾Ë¾Æº¸±â À§ÇÑ ·çƾÀÌ ¸î°¡Áö ÀÖ´Ù. #include int retval, fd; FILE *stream; . . retval = ferror(stream); retval = feof(stream); clearerr(stream); fd = fileno(steam); ferror ´Â ÀÌÀüÀÇ ÀÔ·Â ¶Ç´Â Ãâ·Â ¿ä±¸ ¶§¹®¿¡ ½ºÆ®¸²¿¡ ¿À·ù°¡ ¹ß»ýÇß´Ù¸é 0 ÀÌ ¾Æ´Ñ °ªÀ» µ¹·ÁÁÖ´Â ºÎ¿ï(boolean)ÇÔ¼öÀÌ´Ù. 9.8. ¶óÀÎ ´ÜÀ§ ÀԷ°ú Ãâ·Â ÀڷḦ ¶óÀÎ ´ÜÀ§·Î ÀÔ·ÂÇÏ°í Ãâ·ÂÇϱâ À§ÇÑ ·çƾµéÀº ´ÜÀϹ®ÀÚ I/O ·çƾµé°ú ¹ÐÁ¢ÇÏ°Ô ¿¬°ü µÇ¾î ÀÖ´Ù. ±âº»ÀûÀÎ ¶óÀÎ ÀÔ·Â ·çƾÀº gets ¿Í fgets ÀÌ´Ù. #include char *buf, *retstring; FILE *inf; int nsize; . . retstring = gets(buf); retstring = fgets(buf, nsize, inf); gets ´Â Ç¥ÁØ ÀÔ·Â ½ºÆ®¸² stdin À¸·Î ºÎÅÍ ÀÏ·ÃÀÇ ¹®ÀÚµéÀ» ÀÐ°í °¢ ¹®ÀÚ¸¦ buf °¡ °¡¸®Å°´Â ¹öÆÛ¿¡ ÀúÀåÇÑ´Ù. ¹®ÀÚµéÀº È­ÀÏÀÇ ³¡ ¶Ç´Â newline À» ¸¸³¯ ¶§±îÁö ÀÐÇôÁö°í, newline Àº ¹«½ÃµÇ¸ç ½ºÆ®¸µÀ» Çü¼ºÇϱâÀ§ÇØ ³Î ¹®ÀÚ¸¦ buf ¿¡ ³Ö´Â´Ù. ¿À·ù°¡ ¹ß»ýÇϰųª È­ÀÏÀÇ ³¡¿¡ µµ´ÞÇÏ°í ¾Æ¹«·± ¹®ÀÚµµ ÀÐÇôÁöÁö ¾ÊÀ¸¸é, NULL ÀÌ µ¹¾Æ¿Â´Ù. fgets ´Â gets ÀÇ ÀϹÝÈ­µÈ ÇüÅÂÀÌ´Ù. gets ¿Í fgets ¿¡ ¹Ý´ëµÇ´Â ·çƾµéÀº °¢°¢ puts ¿Í fputs ÀÌ´Ù. #include char *string; FILE *outf; int retval; . . retval = puts(string); retval = fputs(string, outf); puts ´Â ³Î ¹®ÀÚ¸¦ Á¦¿ÜÇÏ°í Ç¥ÁØ Ãâ·Â ½ºÆ®¸²À¸·Î string ¿¡ ÀÖ´Â ¹®ÀÚµéÀ» Ãâ·ÂÇÑ´Ù. fputs ´Â outf °¡ ³ªÅ¸³»´Â Ãâ·Â ½ºÆ®¸²¿¡ string À» Ãâ·ÂÇÑ´Ù. ½Ã ½ºÅÛÀÇ ¿À·¡µÈ ¹öÀü°úÀÇ È£È¯¼ºÀ» º¸ÀåÇϱâ À§ÇØ puts ´Â fputs ¿Í´Â ´Ù¸£°Ô °³Çà ¹®ÀÚ¸¦ ÷°¡ÇÑ´Ù. ¿À·ùÀÇ °æ¿ì µÎ ÇÔ¼ö´Â EOF ¸¦ µ¹·ÁÁØ´Ù. 9.9. ÀÌÁø ÀԷ°ú Ãâ·Â : fread ¿Í fwrite #include char *buffer; int size, nitems, result; FILE *inf, *outf; . . result = fread(buffer, size, nitems, inf); result = fwrite(buffer, size, nitems, outf ); ÀÌÁø ÀԷ°ú Ãâ·ÂÀ» À§ÇØ ¾ÆÁÖ À¯¿ëÇÑ µÎ°³ÀÇ ·çƾÀÌ Á¦°øµÈ´Ù. fread ´Â inf ¿¡ ÇØ´çÇÏ´Â ÀÔ·Â ½ºÆ®¸²À¸·ÎºÎÅÍ nitems °³ÀÇ ÀڷḦ ÀÐ¾î µéÀδÙ. ÀÐÇôÁö´Â ¹ÙÀÌÆ®µéÀº ¹®ÀÚÇü ¹è¿­ buffer ¿¡ ³õ¿©Áø´Ù. ÀÐÇôÁø °¢ À·á´ ±æÀÌ°¡ size ÀÎ ¹ÙÀÌÆ® ¿­·Î¼­ ³ªÅ¸³»¾îÁø´Ù. º¹±Í°ª resul ´Â ¼º°øÀûÀ¸·Î ÀÐÇôÁø ÀÚ·áÀÇ °¹¼ö ¸¦ ³ªÅ¸³½´Ù. fwrite ´Â fread ÀÇ ¹Ý´ëÀÌ´Ù. 9.10. ¹«ÀÛÀ§È­ÀÏ Á¢±Ù : fseek, rewind, ftell Ç¥ÁØ I/O ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¡¸Ó°¡ ½ºÆ®¸²ÀÇ È­ÀÏ Æ÷ÀÎÅÍ À§Ä¡¸¦ ÀçÁ¶Á¤ÇÏ °Å³ª È­ÀÏ Æ÷ÀÎÅÍ ÀÇ ÇöÀç À§Ä¡¸¦ ãÀ» ¼ö ÀÖµµ·Ï ÇÏ´Â ¹«ÀÛÀ§ Á¢±Ù ·çƾÀ» Á¦ °øÇÑ´Ù. ÀÌ·¯ÇÑ ·çƾµéÀº fseek, rewind ¿Í ftell ÀÌ´Ù. #include FILE *stream; long offset, position; int direction, result; . . result = fseek(stream, offset, direction); rewind(stream); position = ftell(stream); fseek Àº ÇÏÀ§ ¼öÁØÀÇ lseek °ú À¯»çÇÏ°í ½ºÆ®¸²°ú °ü·ÃµÈ È­ÀÏÀÇ È­ÀÏ Æ÷ÀÎ ÅÍÀÇ À§Ä¡¸¦ ÁöÁ¤ ÇÑ´Ù. ±×·¯¹Ç·Î fseek Àº ´ÙÀ½ÀÇ ÀÔ·Â ¶Ç´Â Ãâ·ÂÀÇ À§Ä¡¸¦ ´Ù½Ã Á¤ÀÇÇÑ´Ù. direction ¸Å°³º¯¼ö´Â È­ÀÏ¿¡¼­ »õ·Î¿î À§Ä¡°¡ ¾îµð¿¡¼­ºÎÅÍ °è»êµÇ´Â°¡¸¦ °áÁ¤ÇÑ´Ù. direction ÀÌ 0 À¸·Î ÁÖ¾îÁö¸é È­ÀÏÀÇ Ã³À½¿¡¼­ ºÎÅÍ »õ·Î¿î À§Ä¡¸¦ °è»êÇÏ°í, ±× °ªÀÌ 1 À̸é ÇöÀçÀÇ À§Ä¡°¡ »ç¿ëµÇ¸ç, °ªÀÌ 2 ·Î ÁÖ¾îÁö¸é È­ÀÏÀÇ ³¡¿¡¼­ ºÎÅÍ »õ·Î¿î À§Ä¡¸¦ °è»êÇÑ´Ù. offset ¸Å°³º¯¼ö´Â ÀÌ ½ÃÀÛ À§Ä¡¿¡ ´õÇØÁú ¹ÙÀÌÆ®ÀÇ ¼ö¸¦ ³ªÅ¸³½´Ù.rewind(stream) Àº fseek(stream, 0, 0) ÀÇ Ãà¾àÇüÀÌ´Ù. Áï, rewind ´Â Àбâ-¾²±â Æ÷ÀÎÅ͸¦ È­ÀÏÀÇ Ã³À½À¸·Î Áö Á¤ÇÑ´Ù. rewind ´Â ¾Æ¹«·± °ªµµ µ¹·ÁÁÖÁö ¾Ê´Â´Ù(½ÇÁ¦·Î, rewind ´Â void ÇÔ¼ö ·Î Á¤ÀǵȴÙ). ftell Àº ½ºÆ®¸²¿¡¼­ ÇÁ·Î±×·¥ÀÇ ÇöÀç À§Ä¡¸¦ µ·ÁÁØ´. ÇöÀçÀÇ À§Ä¡´Â È­ÀÏÀÇ Ã³À½ºÎÅÍ (0 ¿¡¼­ ºÎÅÍ °è»ê)ÀÇ ¹ÙÀÌÆ® ¼ö·Î ÁÖ¾îÁø´Ù. 9.11. Çü½ÄÈ­µÈ Ãâ·Â : printf #include char *fmt, *string; FILE *outf; int retval; /*NB parameters arg1 .. have arbitrary type */ . . retval = printf(fmt, arg1, arg2 ... argn); retval = fprintf(outf, fmt, arg1, arg2 .. argn); retval = sprintf(string, fmt, arg1, arg2 . argn); ÀÌ ·çƾµéÀº °¢°¢ Ãâ·Â ¹®ÀÚ¿­À» »ý¼ºÇϱâ À§ÇØ ÀÓÀÇÀÇ À¯ÇüÀÇ °¡º¯ÀûÀÎ °¹¼ö ÀÇ ¸Å°³º¯¼ö(arg1, arg2 µî)¿Í Çü½Ä ÁöÁ¤ ¹®ÀÚ¿­ fmt ¸¦ ¸Å°³º¯¼ö·Î °®´Â´Ù. ÀÌ Ãâ·Â ¹®ÀÚ¿­Àº fmt ¿¡ ÁöÁ¤µÈ Çü½ÄÀ» ÀÌ¿ëÇÏ ¿© ¸Å°³º¯¼ö arg1 ºÎÅÍ argn ±îÁöÀÇ Á¤º¸¸¦ Ç¥ÇöÇÑ´Ù. Á¤¼öÇü º¯È¯(integer conversion) %d ºÎÈ£°¡ ÀÖ´Â Á¤¼ö¸¦ À§ÇÑ Ç¥Áغ¯È¯ÄÚµåÀÌ´Ù. Á¤¼ö°¡ À½¼öÀÌ¸é ºÎÈ£°¡ ÀÚ µ¿ÀûÀ¸·Î ÷°¡µÈ´Ù. %u ¸Å°³º¯¼ö´Â ½ÊÁø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÇ´Â ºÎÈ£¾ø´Â Á¤¼öÀÌ´Ù. %o ¸Å°³º¯¼ö´Â ºÎÈ£¾ø´Â ÆÈÁø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÇ´Â Á¤¼öÀÌ´Ù. %x ¸Å°³º¯¼ö´Â ºÎÈ£¾ø´Â ½ÊÀ°Áø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÇ´Â Á¤¼öÀÌ´Ù. ¹®ÀÚ a, b, c, d, e, f °¡ ºÎ°¡ÀûÀÎ ½ÊÀ°Áø¼ö ¼ýÀÚ¸¦ ³ªÅ¸³»±â À§ÇØ »ç¿ëµÈ´Ù. º¯È¯ ¸í¼¼°¡ %X ·Î ÁÖ¾îÁö¸é A, B, C, D, E, F °¡ »ç¿ëµÈ´Ù. %ld ¸Å°³º¯¼ö´Â ºÎÈ£ÀÖ´Â long Á¤¼öÀÌ°í ½ÊÁø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÈ´Ù. ÇÁ·Î±× ·¡¸Ó´Â %lo, %lu, %lx ¿Í %lX À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ºÎµ¿ ¼Ò¼ýÁ¡ º¯È¯(floating-point conversion) %f ¸Å°³º¯¼ö´Â ½ÊÁø¼ö Çü½ÄÀ¸·Î Ãâ·ÂµÇ´Â float ¶Ç´Â double ÇüÀÌ´Ù. %e ¸Å°³º¯¼ö´Â Áö¼öÇü½ÄÀ¸·Î Ãâ·ÂµÇ´Â float ¶Ç´Â double ÇüÀÌ´Ù. ÀÌ°ÍÀº °ú ÇÐ ÀÀ¿ë¿¡ Àß »ç¿ëµÈ´Ù. %g ÀÌ°ÍÀº %e ¿Í %f ÀÇ È¥ÇÕÀÌ´Ù. ÀÌ°ÍÀº ÇØ´çÇÏ´Â ¸Å°³º¯¼ö°¡ float, double Áß Çϳª¶ó´Â °ÍÀ» ³ªÅ¸³½´Ù. ¹®ÀÚ¿­°ú ¹®ÀÚÁ¦¾î %c ¸Å°³º¯¼ö´Â ¹®ÀÚ ±×´ë·Î Ãâ·ÂµÇ´Â char Çü ÀÌ´Ù. ¹®ÀÚ¿¡ ÀúÀåµÈ ¼ýÀÚ°ªÀº Á¤¼ö º¯È¯Äڵ带 »ç¿ëÇÏ¿© Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. %s ÇØ´çÇÏ´Â ¸Å°³º¯¼ö´Â ¹®ÀÚ¿­(Áï, ¹®ÀÚÇü Æ÷ÀÎÅÍ)·Î¼­ Ãë±ÞµÈ´Ù. ÀÌ ¹®ÀÚ ¿­ ³»¿ëÀÌ Ãâ·Â ½ºÆ®¸²À¸·Î Àü´ÞµÈ´Ù. ¹°·Ð, ¹®ÀÚ¿­Àº ³Î ¹®ÀÚ·Î ³¡³ª¾ß ÇÑ´Ù. ±æÀÌ¿Í Á¤µµ(precision)ÀÇ ¸í½Ã º¯È¯ ¸í¼¼´Â ¸Å°³º¯¼ö°¡ Ãâ·ÂµÇ´Â ÇʵåÀÇ ÃÖ¼Ò ¹®ÀÚ ±æÀÌ¿¡ °üÇÑ Á¤º¸¿Í ±× Çʵå´Â Á¤È®µµ¿¡ ´ëÇÑ Á¤º¸¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. Á¤¼öÇü ¸Å°³º¯¼ö ÀÇ °æ¿ìÁ¤µµ´Â ÃÖ¼Ò °¹¼öÀÇ ¼ýÀÚ¸¦ ³ªÅ¸³»°í, float ¶Ç´Â double ¸Å°³º¯¼ö¿¡¼­´Â ¼Ò¼öÁ¡ ´ÙÀ½ ¿¡ ³ªÅ¸³¯ ¼ýÀÚÀÇ °¹¼ö¸¦ ³ªÅ¸³½´Ù. ¹®ÀÚ¿­ ¸Å°³º¯¼ö¿¡¼­´Â ±× ¹®ÀÚ¿­¿¡¼­ Ãë ÇÒ ¼ö ÀÖ´Â ¹®ÀÚµéÀÇ ÃÖ´ë °¹¼ö¸¦ ³ªÅ¸³½´Ù. %10.5d ´Â ÇØ´ç Á¤¼ö ¸Å°³º¯¼ö¸¦ 10 ¹®ÀÚ ±æÀÌ·Î Ãâ·Â ÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù. %.5f ´Â ÇØ´çÇÏ´Â float ¶Ç´Â double ¸Å°³º¯¼ö¸¦ 5 ÀÚ¸® ¼Ò¼öÁ¡À¸·Î Ãâ·ÂÇÑ´Ù. %10s ´Â ±æÀÌ°¡ ÃÖ¼Ò 10 ¹®ÀÚÀÎ Çʵå·Î ÇØ´ç ¹®Àå¿­À» Ãâ·ÂÇÑ´Ù. %-30s ´Â ÇØ´ç ¹®ÀÚ¿­ ¸Å°³º¯¼ö°¡ 30 ¹®ÀÚÀÇ Çʵ忡¼­ ¿ÞÂʺÎÅÍ Ãâ·ÂµÇ´Â °ÍÀ» ³ª Ÿ³½´Ù. Ư¼öºÎÈ£ Ãâ·Â º¯È¯ ¸í¼¼´Â Ãß°¡ÀûÀÎ ºÎÈ£¿¡ ÀÇÇØ ´õ¿í º¹ÀâÇØ Áú¼ö ÀÖ´Ù. # (hash ¶Ç ´Â sharp)ÀÌ ±× ¿¹ÀÌ´Ù. ÀÌ°ÍÀº ¸í¼¼ÀÇ ±æÀÌ ºÎºÐ ¹Ù·Î ¾Õ¿¡ ³ªÅ¸³ª¾ß ÇÑ´Ù. int arg; arg = 0xFF; printf("In octal, %#o\n", arg); ´Â ´ÙÀ½À» Ãâ·ÂÇÑ´Ù. In octal, 0377 + ºÎÈ£´Â ¼ýÀÚ°¡ ¾ç¼öÀÏ ¶§ + ºÎÈ£°¡ Ãâ·ÂµÇµµ·Ï ÇÑ´Ù. float farg; farg = 57.88; printf("Value of farg is %-+10.f\n"); Àº Value of farg is +57.88 À» Ãâ·ÂÇÑ´Ù. sprintf ·çƾ sprintf À» Ãâ·Â ·çƾÀ¸·Î »ý°¢ÇÏÁö ¸¶¶ó. sprintf ´Â °¡Àå ½ÅÃ༺ ÀÖ´Â ¹® ÀÚ¿­ Á¶ÀÛ°ú C ¶óÀ̺귯¸®¿¡¼­ ÀϹÝÀûÀÎ º¯È¯ ´É·ÂÀ» Á¦°øÇÑ´Ù. /*genkey -- generate key for use in data- base */ /* key will always be 20 chars long */ #include char *genkey(buf, suppcode, orderno) char *buf; /*will hold generated key*/ char *suppcode; /*supplier code*/ long orderno; /*order number*/ { /*is suppcode valid?*/ if(strlen(suppcode) != 10) return (NULL); sprintf(buf, "%s_%.9ld", suppcode, orderno); return(buf); } genkey ÀÇ ´ÙÀ½ È£ÃâÀº printf("%s\n", genkey(buf, "abcedfghij", 12)); ´ÙÀ½ ¹®ÀÚ¿­À» Ãâ·ÂÇÑ´Ù. abcedfghij_000000012 9.12. Çü½ÄÈ­µÈ ÀÔ·Â : scanf #include char *fmt, *string; FILE *inf; int retval; /*NB: ptr1... ptrn are all pointers. *The type of the variable they point *to is arbitrary. */ . . retval = scanf(fmt, ptr1, ptr2, .. ptrn); retval = fscanf(inf, fmt, ptr1, ptr2 .. ptrn); retval = sscanf(string, fmt, ptr1, ptr2 .. ptrn); ÀÌµé ·çƾµéÀº printf ÀÇ ·çƾµé°ú´Â ¹Ý´ëµÇ´Â °ÍÀÌ´Ù. À̵éÀº ¸ðµÎ ½ºÆ®¸²À¸ ·ÎºÎÅÍ ÀÔ·Â(sscanf ÀÇ °æ¿ì´Â ¹®ÀÚ¿­)À» ¹Þ¾Æ ¹®ÀÚ¾ó fmt ÀÇ Çü½Ä ÁöÁ¤¿¡ µû ¶ó ÀÔ·ÂÀ» Çص¶ÇÏ°í °á°ú·Î ¾ò¾îÁø ÀڷḦ Æ÷ÀÎÅÍ ptr1, ..., ptrn ÀÌ ³ªÅ¸³» ´Â º¯¼ö¿¡ ÁöÁ¤ÇÑ´Ù. ½ºÆ®¸²¿¡ ´ëÇÑ È­ÀÏ Æ÷ÀÎÅʹ ó¸®µÈ ¹®ÀÚÀÇ °¹¼ö¸¸ ÀüÁø ÇÑ´Ù. ÀϹÝÀûÀ¸·Î scanf Çü½ÄÁöÁ¤ ¹®ÀÚ¿­Àº ´ÙÀ½À» Æ÷ÇÔÇÑ´Ù. 1. °ø¹é¹®ÀÚ(white-space character) : °ø¹é, ÅÇ, °³Ç๮ÀÚ, form feed 2. º¸ÅëÀÇ ºñ°ø¹é¹®ÀÚ : ÀÌ°ÍÀº ÀԷ½ºÆ®¸²ÀÇ ÇØ´ç¹®ÀÚ¿Í ±×´ë·Î ÀÏÄ¡µÈ´Ù. 3. º¯È¯¸í¼¼ : printf ¿¡ »ç¿ëµÇ´Â ¸í¼¼¿Í µ¿ÀÏÇÏ´Ù. /* demo program for scanf */ #include main() { int i1, i2; float flt; char str1[10], str2[10]; scanf("%2d%2d %f %s %s", &i1, &i2, &flt, str1, str2); . . } 9.13. Ç¥ÁØ I/O ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥ÀÇ ¼öÇà Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡´Â ÇÁ·Î±×·¥ÀÌ ´Ù¸¥ ÇÁ·Î±×·¥À» ¼öÇàÇÒ ¼ö ÀÖ°Ô ÇØ ÁÖ ´Â ·çƾÀÌ ¸î°³ ÀÖ´Ù. À̵é Áß¿¡¼­ °¡Àå ±âÃÊÀûÀÎ °ÍÀº system ÀÌ´Ù. #include int retval; char *comstring; . . retval = system(comstring); ½Ã½ºÅÛÀº comstring ¿¡ ´ã°ÜÁø ¸í·É¾î¸¦ ¼öÇàÇÑ´Ù. À̸¦ À§Çؼ­ ¿ì¼± ÀÚ½Ä ÇÁ ·Î¼¼½º »ý¼ºÇÑ´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º´Â ´Ù½Ã exec ¸¦ È£ÃâÇÏ¿© Ç¥ÁØ UNIX ½© (/bin/sh)À» ¼öÇàÇÏ°í comstring À» ÀÔ·ÂÀ¸·Î ÁØ´Ù. (SVID ¿¡¼­ ½ÇÁ¦·Î ¾ð±ÞÇÑ °ÍÀº ¸í·É¾î Çؼ®±âÀÌÁö¸¸ À̵µ ¿ª½Ã UNIX ½©°ú À¯»çÇÏ°Ô Çص¿ÇØ¾ß ÇÑ´Ù.) system ·çƾ¿¡¼­ ºÎ¸ð ÇÁ·Î¼¼¼­ wait ¸¦ È£ÃâÇÔÀ¸·Î½á ÁÖ¾îÁø ¸í·É¾îÀÇ ¼öÇàÀÌ ¿Ï·áµÈ ´ÙÀ½¿¡ ¼öÇàÀ» Àç°³Çϵµ·Ï ÇÑ´Ù. °á°úÀûÀ¸·Î µ¹¾Æ¿À´Â °ª retval Àº ½© ÀÇ Á¾·á»óÅ·μ­, ÀÌ °ª¿¡ ÀÇÇØ ÁÖ¾îÁø ¸í·É¾î°¡ ¼º°øÇß´ÂÁö ½ÇÆÐÇß´Â Áö¸¦ ¾Ë ¾Æ³¾¼ö ÀÖ´Ù. ¸¸¾à fork ³ª exec È£ÃâÀÌ ½ÇÆÐÇϸé retval ÀÇ °ªÀº -1 ÀÌ µÈ´Ù. system ¿¡´Â Ä¿´Ù¶õ °áÁ¡ÀÌ ÀÖ´Ù. ÇÁ·Î±×·¥Àº ÀÚ½ÅÀÌ ¼öÇàÇÑ ¸í·É¾î·Î ºÎÅÍÀÇ Ãâ·Â¿¡ Á÷Á¢ Á¢±ÙÇÒ ±æÀÌ ¾ø´Ù. ÀÌÁ¢À» ÇØ°áÇÏ·Á¸é Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ ÀÖ ´Â popen °ú pclose ·çƾ À» »ç¿ëÇØ¾ß ÇÑ´Ù. #include FILE *strm, *popen(); char *comstring, *typestring; int retval; . . strm = popen(comstring, type); retval = pclose(strm); system ÀÇ °æ¿ì¿Í °°ÀÌ popen µµ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ¿© comstring ÀÌ °¡ ¸®Å°´Â ¸í·É¾î¸¦ ¼öÇà°Ô ÇÑ´Ù. ±×·¯³ª system °ú ´Ù¸¥ Á¡Àº È£ Ãâ ÇÁ·Î¼¼½º¿Í ¸í·É¾î »çÀÌ¿¡ ÆÄÀÌÇÁ¸¦ »ý¼ºÇÏ´Â °ÍÀÌ´Ù. À̶§ ÆÄÀÌÇÁ¿¡ ½ºÆ®¸²ÀÌ ´ëÀÀµÇ°Ô µÇ°í, ÀÌ´Â strm ¿¡ ÁöÁ¤µÈ´Ù. À̶§ type ÀÇ °ªÀÌ "w" ¶ó¸é ÇÁ·Î±×·¥¿¡¼­ÀÇ Ãâ ·ÂÀÌ ½ºÆ®¸²À» ÅëÇØ ¸í·É¾îÀÇ Ç¥ÁØ ÀÔ·ÂÀ¸·Î Àü´ÞµÉ ¼ö ÀÖ´Ù. type ÀÌ "r" ÀÌ ¶ó¸é ¹Ý´ë·Î ¸í·É¾îÀÇ Ç¥ÁØ ÀÔ·ÂÀ» ÇÁ·Î±×·¥¿¡¼­ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ°Ô µÈ´Ù. popen À¸·Î °³¹æµÈ ½ºÆ®¸²Àº Ç×»ó pclose ·Î Æó¼âµÇ¾î¾ß ÇÑ´Ù. 9.14. ±âŸÀÇ È£Ãâ Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ ÀÖ´Â ±× ¹ÛÀÇ ÇÔ¼ö¸¦ »ìÆ캸ÀÚ. 9.14.1. freopen °ú fdopen #include FILE *oldstream, *newstream; char *type, *filename; int filedes; . . newstream = freopen(filename, type, oldstre am); oldstream = fdopen(filedes, type); freopen Àº oldstream ÀÌ °¡¸®Å°´Â ½ºÆ®¸²À» Æó¼âÇÏ°í filename ¿¡¼­¿À´Â ÀÔ ·ÂÀ» À§ÇØ À̸¦ ´Ù½Ã °³¹æÇÑ´Ù. type Àº »õ·Î¿î ½ºÆ®¸²À» Á¢±ÙÇÏ´Â ¸ðµå¸¦ °á Á¤ÇÑ´Ù. µÎ ÇÔ¼ö ¸ðµÎ ¿À·ù°¡ ¹ß»ýÇϸé NULL À» µ¹·ÁÁØ´Ù. 9.14.2. ´Ü¾î ÀÔÃâ·Â : getw ¿Í putw #include int word, res; FILE *inf, *outf; . . word = getw(inf); res = putw(word, outf); ÀÌµé µÎ ·çƾÀº ´Ü¾î(word) ´ÜÀ§·Î ÀÔÃâ·ÂÀ» ¼öÇàÇÑ´Ù. ´Ü¾î¶õ C ÄÄÆÄÀÏ·¯°¡ Á¦°øÇÏ´Â Á¤¼ö ÇüÀÚ·á·Î¼­ ´Ü¾îÀÇ Å©±â, ±×¸®°í À̵é ÇÔ¼öÀÇ »ç¿ë¹ýÀº ÄÄÇ»ÅÍ ¸¶´Ù ´Ù¸£´Ù. getw ´Â inf °¡ °¡¸®Å°´Â ½ºÆ®¸²ÀÇ ´ÙÀ½¹ø ´Ü¾î (Áï ÀÌÁø Á¤¼ö) ¸¦ °¡Á®¿Â´Ù. putw ´Â outf °¡ °¡¸®Å°´Â ½ºÆ®¸²¿¡ ÇÑ ´Ü¾î¸¦ ½á ³Ö´Â´Ù. µÎ ÇÔ ¼ö ¸ðµÎ ¿À·ù ¹ß»ý½Ã¿¡´Â EOF ¸¦ µ¹·ÁÁØ´Ù. 9.14.3. ¹öÆÛÀÇ Á¦¾î : setbuf setvbuf #include FILE *stream; char buf1[BUFSIZ], buf2[SOMEVALUE]; int type, size, res; . . setbuf(stream, buf); res = setvbuf(stream, buf2, type, size); setbuf ´Â Ç¥ÁØ I/O ¶óÀ̺귯¸®°¡ º¸Å붧 ÇÒ´çÇÏ´Â ¹öÆÛ ´ë½Å buf1 À» »ç¿ë Çϵµ·Ï ÇØÁØ´Ù. buf1 ÀÇ Å©±â´Â stdio.h ¿¡ Á¤ÀÇµÈ »ó¼ö BUFSIZ °¡ °áÁ¤ÇÑ´Ù. setbuf ÀÇ Àμö·Î ¹®ÀÚÇü Æ÷ÀÎ NULL À» Àü´ÞÇϸé ÀÔÃâ·ÂÀº ¹öÆÛ¿¡ ´ã±âÁö ¾Ê´Â ´Ù. ÀÌ ±â´ÉÀº ºñÁ¤»óÀûÀ¸·Î Á¾·áÇÏ´Â ÇÁ·Î±×·¥¿¡¼­ ¹öÆÛ¿¡ ÀÖ´Â ÀڷḦ ÀÒ¾î ¹ö¸± ¿ì·Á°¡ ÀÖÀ» ¶§, À̸¦ µð¹ö±ëÇϱâ À§ÇØ »ç¿ëµÉ ¼ö ÀÖ´Ù. setvbuf ´Â Ç¥ÁØ I/O ¶óÀ̺귯¸®¿¡ »õ·Î ÷°¡µÈ ÇÔ¼ö·Î¼­ setbuf º¸´Ù ´õ Á¤¹ÐÇÑ Á¦¾î¸¦ °¡´ÉÇÏ °Ô ÇÑ´Ù. type Àμö´Â stream ÀÌ ¹öÆÛ¸µµÇ´Â ¹æ¹ýÀ» ÁöÁ¤ÇÑ´Ù. ÀÌ¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â °ªÀº stdio.h ¿¡ ´ÙÀ½°ú °°ÀÌ ¼¼°¡Áö·Î Á¤ÀǵǾî ÀÖ´Ù. _IOFBF ½ºÆ®¸²Àº ¿ÏÀüÈ÷ ¹öÆÛ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ´Ü¸»±â¿¡ ¿¬°áµÇÁö ¾ÊÀº ¸ð µç ½ºÆ®¸²¿¡ ´ëÇÑ ±âº» °ªÀÌ´Ù. µû¶ó¼­ ÀڷḦ ÀÐ°í ¾µ¶§´Â È¿À²À» ±Ø´ëÈ­ Çϱâ À§ÇØ BUFSIZ °³ÀÇ ¹ÙÀÌÆ®¸¦ ´ÜÀ§·Î ÇÑ´Ù. _IOLBF Ãâ·ÂÀº ¶óÀÎ ´ÜÀ§·Î ¹öÆÛ¿¡ ´ã±â°í newline¹®ÀÚ°¡ ¾²ÀÏ ¶§¸¶´Ù ¹öÆÛ¸¦ ºñ¿ì °Ô µÈ´Ù. ¹öÆÛ¸¦ ºñ¿ï °æ¿ì´Â ÀÌ ¹Û¿¡µµ ¹öÆÛ°¡ ¸ðµÎ áÀ» ¶§³ª ÀÔ·ÂÀÌ ¿ä ±¸µÈ °æ¿ìÀÌ´Ù. ÀÌ´Â ´Ü¸»±â¸¦ À§ÇÑ ±âº»°ªÀÌ¸ç ´ëÈ­½Ä »ç¿ë¿¡ µµ¿òÀ» ÁÖ±â À§ÇØ °í¾ÈµÇ¾ú´Ù. _IOBNF À̶§´Â ÀÔÃâ·Â¿¡ ¹öÆÛ¸¦ »ç¿ëÇÏÁö ¾Ê°Ô µÈ´Ù. ÀÌ °æ¿ì buf2 ¿Í size ´Â ¹« ½ÃµÈ´Ù. ÀÌ ¸ðµå´Â ¿À·ù±â·Ï½Ã À¯¿ëÇÏ´Ù. type À̳ª size ¿¡ ºÎ´çÇÑ °ªÀÌ »ç¿ëµÇ¸é setv buf ´Â 0 ÀÌ ¾Æ´Ñ °ªÀ» µ¹·ÁÁÜ ¿¡ ÁÖÀÇÇ϶ó. ¿ªÀ¸·Î 0 ÀÌ µ¹¾Æ¿À¸é ¼º°øÀ» ÀǹÌÇÑ´Ù. ? ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 62¹ø Á¦ ¸ñ:[moohou] Unix System Programming 10 ¿Ã¸°ÀÌ:kingcrab(¹ÚÀçÈ­ ) 94/10/16 12:43 ÀÐÀ½:4149 °ü·ÃÀÚ·á ¾øÀ½ ------------------------------------------------------ ___________________________________________ Unix System Programming 10 - ±è¼ºÈ£(moohou) ___________________________________________ Á¦10Àå È­¸éÁ¶ÀÛ 10.1. ¼­·Ð CRT/VDU ´Ü¸»±âÀÇ È­¸éÀ» ´Ù·ç´Â µµ±¸µéÀ» ¼Ò°³ÇÑ´Ù. È­¸éÀ» ´Ù·ç´Â µµ±¸¿¡´Â ¹ÐÁ¢ÇÏ°Ô °ü·ÃµÈ µÎ°³ÀÇ C ¶óÀ̺귯¸®°¡ ÀÖ´Ù. 1. curses ÀÌ°ÍÀº Çϵå¿þ¾î¿¡ ÀÇÁ¸ÇÏÁö ¾Ê°í È­¸éÀ» Á¶ÀÛÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ ¶óÀ̺귯¸®´Â ´Ü¸»±âÀÇ Çϵå¿þ¾î¿¡ ¹«°üÇÑ ÀڷᱸÁ¶ÀÎ À©µµ¿ì(window)¸¦ Á¦°øÇÑ´Ù. curses¶ó´Â À̸§ ¿ª½Ã ÃÖÀûÈ­ Ä¿¼­ À̵¿ (cursor motion optimization )¿¡¼­ µû¿Â°ÍÀÌ´Ù. ÀÌ°ÍÀº AT&T ½Ã½ºÅÛ V ÀÎÅÍÆäÀ̽º Á¤ÀÇ (SVID) ÀÇ Issue 2 ¿¡ Á¤ÀǵǾî ÀÖ´Ù. 2. terminfo ÀÌ ¶óÀ̺귯¸®´Â curses ¿Í´Â ´Þ¸® Çϵå¿þ¾î¿Í ¹ÐÁ¢ÇÑ ¿¬°ü¼ºÀ» °¡Áø ·çƾÀ» Á¦°øÇÑ´Ù. terminfo ¿ª½Ã SVID ÀÇ Issue 2 ¿¡ Á¤ÀǵǾî ÀÖ´Ù. curses ¿Í terminfo µÑ´Ù, ÇöÀçÀÇ ¹öÀüÀº terminfo ¶ó´Â °¢°¢ÀÇ ´Ü¸»±âÀÇ Æ¯ ¼ºÀ» ±â·ÏÇØ µÎ´Â µ¥ÀÌŸº£À̽º(database)¸¦ »ç¿ëÇÑ´Ù. /usr/lib/terminfo// Àº ½ÇÁ¦ ´Ü¸»±âÀÇ À̸§ÀÌ°í ´Â ÀÇ Ã¹±ÛÀÚÀÌ´Ù. /usr/lib/terminfo/v/vt100 Àº ´Ü¸»±â vt100 ÀÇ Æ¯¼ºµéÀ» ±â·ÏÇصδ ȭÀÏÀÌ´Ù. curses ¿Í terminfo ÀÇ ·çƾµéÀº ¸ÕÀú ȯ°æ º¯¼ö(environment variable) TERM À» º¸°í ´Ü¸»±âÀÇ À̸§ À» ¾Ë¾Æ³½ ´ÙÀ½, terminfo µ¥ÀÌŸº£À̽º¿¡¼­ ±× ´Ü¸»±â¿¡ ´ëÀÀÇÏ´Â È­ÀÏÀ» 㠴´Ù. termcap ¶óÀ̺귯¸® terminfo ´Â AT&T ¿¡¼­ »õ·ÎÀÌ ¸¸µé¾î ³½ °ÍÀÌ´Ù. ¾î¶² UNIX ½Ã½ºÅÛ¿¡¼­´Â terminfo ´ë½Å termcap À̳ª termlib °¡ ÀÖÀ» ¼öµµ ÀÖ´Ù. termcap Àº ´Ü¸»±â ¸í¼¼°¡ /etc/termcap À̶ó´Â È­ÀÏ¿¡ ±â·ÏµÇ¾îÀÖ´Ù. »õ·Î¿î ´Ü¸»±â¿¡ ´ëÇÑ ¸í¼¼ ¸¦ ¸¸µé·Á¸é ±× È­ÀÏÀ» »ç¿ëÀÚ°¡ ÆíÁý(edit)ÇÏ¸é µÈ´Ù. ¼ÒÇÁÆ®¿þ¾î °³¹ßÀ» ½± °ÔÇϱâ À§ÇØ terminfo ¶óÀ̺귯¸®´Â termcap ¶óÀ̺귯¸®º¸´Ù »óÀ§ÀÇ È£È¯¼ºÀ» °¡Áø´Ù. 10.2. curses ¶óÀ̺귯¸® : °³¿ä ÇÁ·Î±×·¡¸Ó´Â À©µµ¿ì¶ó´Â ÀڷᱸÁ¶¸¦ ÅëÇؼ­ ¸ðµç ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù. À©µµ¿ì ÀÇ ÀÚ·áÇüÀº WINDOW Àε¥, ÀÌ°ÍÀº Ç¥ÁØ ÀÎÅ©·çµå È­ÀÏ(standard include file) ÀÎ curses.h ¿¡ Á¤ÀÇ°¡ µÇ¾îÀÖ´Ù. ÇÁ·Î±×·¡¸Ó´Â newwin À̶ó´Â ·çƾÀ» »ç¿ëÇØ ¼­ »õ·Î¿î À©µµ¿ì¸¦ ¸¸µé ¼ö ÀÖ´Ù. ±×¸®°í Àü¿ª¿¡¼­ »ç¿ëÇÒ ¼ö Àִ ǥÁØ À©µµ ¿ì stdscr µµ ÀÖ´Ù. curses ¿¡ ´ëÇØ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇϱâ Àü¿¡ µÎ°¡Áö Á¡À» ¸ÕÀú ÁöÀûÇÏ°í ³Ñ¾î °¡·Á°í ÇÑ´Ù. 1. curses ÀÇ ·çƾµéÀÌ ÀÚµ¿ÀûÀ¸·Î ÇÁ·Î±×·¥°ú ¸µÅ©µÇ´Â °ÍÀº ¾Æ´Ï´Ù. µû¶ó¼­ ÄÄÆÄÀÏÇÒ ¶§, »ç¿ëÀÚ°¡ ¸µÅ©½ÃÄÑ¾ß ÇÑ´Ù. $cc -o scrnprog scrnprog.c -lcurses terminfo ¿¡ ´ëÇؼ­µµ °°Àº ¹æ¹ýÀ¸·Î ¸µÅ©ÇÑ´Ù. 2. curses ´Â C ¾ð¾îÀÇ ¸ÅÅ©·Î(macro)¸¦ ÀÌ¿ëÇؼ­ Á¤ÀǵǴ °ÍÀÌ ¸¹´Ù. µû¶ó ¼­ ÇÁ·Î±×·¡¸Ó´Â ±×°ÍµéÀ» »ç¿ëÇÒ ¶§ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ±×¸®°í ÄÄÆÄÀϽà ¿¹ »óÄ¡ ¸øÇÑ ¿À·ù ¸Þ½ÃÁö¿¡ ´ëºñÇØ¾ß ÇÑ´Ù. 10.3. curses ÀÇ ÀϹÝÀûÀÎ ±¸Á¶ ¸ðµç curses ÇÁ·Î±×·¥Àº ±âº»ÀûÀÎ ±¸Á¶·Î ±¸¼ºµÈ´Ù. #include main() { initscr(); /* main body */ endwin(); exit(0); } curses.h ´Â curses ·çƾÀ» »ç¿ëÇÏ´Â ¸ðµç ÇÁ·Î±×·¥¿¡ Ç×»ó Æ÷ÇÔ(include) µÇ ¾î¾ß ÇÑ´Ù. ½Ã½ºÅÛ V ¿¡¼­´Â curses.h ¿¡ ÇìµåÈ­ÀÏ terminfo.h °¡ ÀÚµ¿ÀûÀ¸·Î Æ÷ÇԵȴÙ. curses.h ¿¡´Â curses ÀÇ ÀڷᱸÁ¶¿Í Áß¿äÇÑ ¸ÅÅ©·ÎµéÀÌ µé¾îÀÖ´Ù. initscr ·çƾÀº ¸ðµç curses ÇÔ¼ö¿¡ ¾Õ¼­¼­ ¼öÇà½ÃÄÑ¾ß ÇÑ´Ù. ÀÌ ·çƾÀº curses ÀÇ ÀڷᱸÁ¶¸¦ ÃʱâÈ­ÇÏ°í UNIX ȯ°æÀÇ TERM º¯¼ö¸¦ ÅëÇÏ¿© ´Ü¸»±âÀÇ Á¾·ù¸¦ °áÁ¤ÇÑ´Ù. ±×·¸°Ô ÇÔÀ¸·Î¼­ ¿ø·¡ÀÇ ´Ü¸»±â »óÅ·Πµ¹¾Æ°¥ ¼ö ÀÖ°í Ä¿¼­ ´Â ¸Ç ¾Æ·¡ ¿ÞÂÊ¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. #include main() { initscr(); refresh(); endwin(); } refresh ¶Ç´Â ´õ ÀϹÝÀûÀÎ ¹öÀüÀÎ wrefresh ¸¦ ¼öÇà½ÃÄѾ߸¸ À©µµ¿ìÀ¸ ³»¿ëÀÌ ½ÇÁ¦È­¸é (physical screen) ¿¡ ³ªÅ¸³ª°Ô µÈ´Ù. refresh ´Â Ç¥ÁØÀ©µµ¿ì stdscr ÀÇ ³»¿ëÀ» ½ÇÁ¦È­¸é¿¡ Ç¥½ÃÇÏ°í, wrefresh ´Â ƯÁ¤ À©µµ¿ìÀÇ ³»¿ëÀ» ½ÇÁ¦È­¸é ¿¡ Ç¥½ÃÇÑ´Ù. 10.4. ¸ðµå ÁöÁ¤ curses ·çƾÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥¿¡¼­´Â initscr À» ¼öÇà½ÃŲ ´ÙÀ½ ´Ü¸»±âÀÇ ÀÔÃâ·Â ¸ðµå¸¦ ÁöÁ¤ÇÑ´Ù. echo(); /* enable echoing */ noecho(); /* disable echoing */ ´Ü¸»±âÀÇ ¹ÝÇâ(echo) ±â´ÉÀ» ÀÛµ¿½ÃÅ°°Å³ª Á¤Áö½Ãų ¼ö ÀÖ´Ù. µðÆúÆ® (default)·Î´Â ¹ÝÇâ ±â´ÉÀ» ÀÛµ¿½ÃŲ´Ù. nl(); /* enable CR-NL mappings */ monl(); /* disable mappings */ nl Àº Ãâ·Â½Ã °³Ç๮ÀÚ(newline) °¡ newline/ carriage-return À¸·Î ¹Ù²î¾î¼­ Ãâ·ÂµÇ°Å³ª, ÀԷ½à newline/carriage-return ÀÌ °³Ç๮ÀÚ·Î ¹Ù²î¾î¼­ ÀÔ·ÂµÈ ´Ù. default ´Â nl ÀÌ´Ù. cbreak(); /* enable CBREAK mode */ nocbreak(); /* disable CBREAK mode */ cbreak ´Â ÀԷ½Ã, ÀÎÅÍ·´Æ®(interrupt) ¿Í È帧 Á¦¾î Å°(flow control key) ¸¦ Á¦¿ÜÇÏ°í´Â ÀÔ·ÂÀÚ·á¿¡ ¾î¶°ÇÑ ÀÛ¿ëµµ °¡ÇÏÁö ¾Ê´Â´Ù. raw(); /* enable RAW mode */ noraw(); /* disable RAW mode */ raw ´Â ´Ü¸»±â¸¦ RAW ¸ðµå·Î ¸¸µç´Ù. ÀÌ ¸ðµå´Â CBREAK ¸ðµå¿Í ºñ½ÁÇѵ¥, ´Ù ¸¥°ÍÀº ½Åȣó¸®(signal processing)°ú ȸ§Á¦¾î¸¶Àúµ ÀÛµ¿ÁßÁö½ÃŲ »óŶó´Â Á¡ÀÌ´Ù. savetty(); /* save tty state */ resetty(); /* reset tty state */ ´Ü¸»±âÀÇ »óŸ¦ ÀúÀåÇϰųª º¹±¸½Ãų ¼ö ÀÖ´Ù. savetty ´Â ÇöÀç ´Ü¸»±â »óÅ ¸¦ curses ÀÇ ³»ºÎ¹öÆÛ¿¡ ÀúÀåÇØ ÁØ´Ù. restty ´Â ¹Ù·Î Àü¿¡ savetty ·Î ÀúÀå ÇصР»óŸ¦ º¹±¸½ÃŲ´Ù. 10.5. ¹®ÀÚ¿Í ¹®ÀÚ¿­ ¾²±â curses ´Â À©µµ¿ì stdscr ¿¡ ¹®ÀÚ¿Í ¹®ÀÚ¿­À» ¾²´Â 4 °³ÀÇ ·çƾÀ» Á¦°øÇÑ´Ù. addch, mvaddch, addstr, mvaddstr ÀÌ´Ù. #include int c, y, x; char *string; . . addch(c); mvaddch(y, x, c); addstr(string); mvaddstr(y, x, string); addch ·çƾÀº stdscr »óÀÇ ÇöÀç Ä¿¼­ À§Ä¡¿¡ ¹®ÀÚ c ¸¦ ¾´´Ù. refresh ¸¦ ÇØ ÁÖ¾î¾ß¸¸ ½ÇÁ¦ È­¸é¿¡ ³ªÅ¸³­´Ù. CTRL-C ´Â ^C ó·³ ¾²ÀδÙ. mvaddch ·çƾÀº Ä¿¼­¸¦ ¼¼·Î·Î y ¹ø° ÁÙ, °¡·Î·Î x ¹ø° ¿­·Î ¿òÁ÷ÀÎ ÈÄ¿¡ ±ÛÀÚ¸¦ ¾´´Ù. ¸Ç À­ÁÙ ¿ÞÂÊÀÌ ÁÂÇ¥(0,0)ÀÌ´Ù. addstr °ú mvaddstr Àº 0 À¸·Î ³¡³ª´Â ¹®ÀÚ¿­ string À» À©µµ¿ì stdscr ¿¡ ¾´´Ù. 10.6. Çü½ÄÈ­µÈ Ãâ·Â curses ¿¡´Â C ¾ð¾îÀÇ printf ¿Í ºñ½ÁÇÑ ±â´ÉÀ» Á¦°øÇÏ´Â ·çƾµéÀÌ ÀÖ´Ù. Ç¥ ÁØ À©µµ¿ì stdscr ¿¡ ¾²ÀÌ´Â ·çƾµé·Î´Â printw ¿Í mvprintw °¡ ÀÖ´Ù. #include char *fmt; int y, x; /* NB arg0, arg1 ... argn have arbitrary type */ . . printw(fmt, arg0, arg1, ... argn); mvprintw(y, x, fmt, arg0, arg1, ... argn); 10.7. Ä¿¼­ À̵¿ move ¸í·ÉÀ» »ç¿ëÇÏ¿© Ç¥ÁØ À©µµ¿ì stdscr À§¿¡¼­ Ä¿¼­¸¦ ¿òÁ÷ÀÏ ¼ö ÀÖ´Ù. #include int y, x; . . move(y, x); ¸Å°³º¯¼ö y ¿Í x ¸¦ »ç¿ëÇÏ¿© »õ·Î¿î ÁÂÇ¥¿¡ Ä¿¼­¸¦ À§Ä¡½Ãų ¼ö ÀÖ´Ù. refresh °¡ ¼öÇàµÇ¾î¾ß¸¸ ½ÇÁ¦ Ä¿¼­ À§Ä¡°¡ ¹Ù²ï´Ù. getyx ·çƾÀ» »ç¿ëÇÏ¿© Ä¿¼­ÀÇ ÇöÀç À§Ä¡¸¦ ¾Ë¼ö ÀÖ´Ù. #include int y, x; WINDOW *w; . . getyx ´Â WINDOW ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ°¡ ù¹ø° º¯¼ö·Î ÁÖ¾îÁ®¾ß ÇÑ´Ù. ù¹ø° º¯ ¼ö·Î Ç¥ÁØ È­¸éÀÎ stdscr À» »ç¿ëÇϸé Ç¥ÁØ È­¸é»óÀÇ ÇöÀç Ä¿¼­ À§Ä¡¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ¼öÇà °á°ú´Â y ¿Í x º¯¼ö ¿¡ ÁÖ¾îÁø´Ù. getyx °¡ ½ÇÁ¦ C ÇÔ¼ö°¡ ¾Æ´Ï ¶ó ¸ÅÅ©·Î(macro)À̱⠶§¹®¿¡ °¡´ÉÇÑ °ÍÀÌ´Ù. 10.8. Å°º¸µå ÀÔ·Â : getch curses ¿¡¼­ Å°º¸µå·Î ºÎÅÍ ÇϳªÀÇ ¹®ÀÚ¸¦ ¹Þ¾Æ µéÀÏ °æ¿ì¿¡ getch ¸¦ »ç¿ëÇÑ ´Ù. getch ´Â C ¾ð¾îÀÇ getc ·çƾó·³ Á¤¼ö°ªÀ» µ¹·ÁÁØ´Ù. #include int in_ch; . . in_ch = getch(); ±â´ÉÅ° ÀԷ óÀ½ ÇؾßÇÏ´Â ÀÛ¾÷Àº curses keypad ·çƾÀ» ¼öÇà½ÃÄѼ­ ´Ü¸»±âÀÇ Å°Æеå (keypad)¸¦ ÃʱâÈ­½ÃÅ°´Â °ÍÀÌ´Ù. keypad(stdscr, TRUE); Ư¼öÅ°´Â curses.h ¿¡ Á¤ÀÇµÈ °ªÀ» ÅëÇØ µ¹·ÁÁØ´Ù. ASCII °ª°úÀÇ Ãæµ¹À» ¸·±â À§ÇØ ÀÌ °ªµéÀº 8 Áø¼ö 401 ºÎÅÍ ½ÃÀ۵ȴÙ. int in_ch; . . in_ch = getch(); switch(in_ch){ case KEY_DOWN; /* down arrow key processing */ . . case KEY_UP; /* up arrow key processing */ . . } 10.9. È­¸é ÀÔ·Â : inch stdscr ÀÇ Æ¯Á¤ À§Ä¡¿¡ ¾î¶² ¹®ÀÚ°¡ ÀÖ´Â Áö ¾Ë¾Æ¾ß µÉ °æ¿ì°¡ ÀÖ´Ù. inch ´Â È­¸éÀÇ ÇöÀç Ä¿¼­ À§Ä¡¿¡ ÀÖ´Â ¹®ÀÚ¸¦ µ¹·ÁÁØ´Ù. ±×¸®°í mvinch ´Â ÁÖ¾îÁø À§ Ä¡ÀÇ ¹®ÀÚ¸¦ µ¹·ÁÁØ´Ù. #include int in_ch; . . in_ch = inch(); in_ch = mvinch(y, x); È­¸é»óÀÇ ±ÛÀÚ¿¡´Â ÇÏÀ̶óÀÌÆ® ŸÀÔ(highlight type) °°Àº ¼Ó¼º(attribute)À» Áö´Ñ °æ¿ì°¡ ÀÖ´Ù. À̶§ ½ÇÁ¦ ¹®ÀÚ¸¸À» ¾ò°í ½ÍÀ¸¸é curses.h ¿¡¼­ Á¤ÀÇµÈ »ó ¼ö A_CHARTEXT ¿Í ºñÆ®´ÜÀ§ AND ¸¦ ÇؾßÇÑ´Ù. cvalue = ivalue & A_CHARTEXT; 10.10. È­¸é ÆíÁý ÀÌ¹Ì ±×·ÁÁø È­¸éÀ» º¯È­½ÃÄÑ¾ß ÇÏ´Â °æ¿ì°¡ Á¾Á¾ ÀÖ´Ù. curses ¿¡´Â ÀÌ·¯ÇÑ °æ¿ì¿¡ À¯¿ë ÇÑ ¿©·¯°¡Áö ·çƾµéÀÌ ÀÖ´Ù. ÀÌ·¯ÇÑ ·çƾµéÀ» 3°¡Áö·Î ±¸ºÐÇÒ ¼ö ÀÖ´Ù. È­¸éÀ» ¹éÁöÈ­(clear)½ÃÅ°´Â °Í, ¹®ÀÚµéÀ» Áö¿ì°í È­¸éÀ» À籸¼ºÇÏ´Â °Í, È­¸éÀ» ÀüÇô Áö¿ì´Â °Í¾øÀÌ ¹®ÀÚ¸¦ ³¢¿ö ³Ö´Â °ÍµîÀÌ ÀÖ´Ù. stdscr »ó¿¡¼­ È­¸éÀÇ ÀϺκÐÀ» Áö¿ì´Â ·çƾ #include . . erase(); clear(); clrtobot(); clrtoeol(); erase ¿Í clear Àº µÑ´Ù Ç¥ÁØ À©µµ¿ì stdscrÀÇ ¸ðµç À§Ä¡¿¡ °ø¹é(space)À» ¾´´Ù. ´Ù¸¥Á¡Àº clear ´Â ¶ÇÇÑ ´ÙÀ½¹ø refresh °¡ È£ÃâµÉ ¶§ È­¸éÀ» ÀÚµ¿Àû À¸·Î ¹éÁöÈ­ ½ÃŲ´Ù´Â Á¡ÀÌ´Ù. clrtobot ´Â ÇöÀçÁÙÀÇ Ä¿¼­ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ¸ð µç ¹®ÀÚ¿Í Ä¿¼­ ¾Æ·¡¿¡ ÀÖ´Â ¸ðµç ÁÙÀ» Áö¿î´Ù. clrtoeol Àº ÇöÀçÁÙ¿¡¼­ Ä¿¼­ ÀÇ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ¸ðµç ¹®ÀÚ¸¦ Áö¿î´Ù. È­¸é»óÀÇ ¹®ÀÚµéÀ» Áö¿ï »Ó¸¸ ¾Æ´Ï¶ó ¹®ÀÚ¸¦ Áö¿ì¸é¼­ »ý±ä °ø¹éÀ» ¸Þ²Ù±â À§ Çؼ­ È­¸éÀ» À̵¿½ÃÅ°´Â ·çƾ #include int y, x; . . delch(); mvdelch(y, x); deleteln(); delch ÀÇ °æ¿ì ÇöÀç Ä¿¼­ À§Ä¡¿¡ ÀÖ´Â ¹®ÀÚ°¡ Áö¿öÁø´Ù. ±×¸®°í ±× °ø¹éÀ» ¸Þ²Ù±â À§ÇØ Ä¿¼­ÀÇ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ¹®ÀÚµéÀ» ÇÑ Ä­¾¿ ¿ÞÂÊÀ¸·Î À̵¿½ÃŲ´Ù. mvdelch µµ ±â´ÉÀÌ °ÅÀÇ °°´Ù. ´Ù¸¸ ¸ÕÀú Ä¿¼­¸¦ ÁÖ¾îÁø À§Ä¡¿¡ À̵¿½ÃŲ ´Ù À½ delch ¿Í °°Àº ±â´ÉÀ» ¼öÇàÇÑ´Ù. deleteln Àº Ä¿¼­°¡ ÀÖ´Â ÁÙÀ» Áö¿î´Ù. ±× ¸®°í ³ª¼­ ±× ÁÙ ¹Ø¿¡ ÀÖ´ø ¸ðµç ÁÙÀ» ÇÑ Ä­¾¿ À§·Î À̵¿½ÃŲ´Ù. ¹®ÀÚ¸¦ ³¢¿ì´Â µ¥ °ü·ÃµÈ ·çƾ #include int c, y, x; . . insch(c); mvinsch(y, x, c); insertln(); insch ´Â ÇöÀç À§Ä¡¿¡ ¹®ÀÚ c ¸¦ ³¢¿î´Ù. ÇöÀç Ä¿¼­ À§Ä¡ÀÇ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ±ÛÀÚµéÀº ¸ðµÎ ÇÑ Ä­¾¿ ¿À¸¥ÂÊÀ¸·Î À̵¿ÇÑ´Ù. ±× ÁÙÀÇ ¸¶Áö¸·¿¡ ÀÖ´Â ¹®ÀÚ´Â ÀÒ¾î¹ö¸®°Ô µÈ´Ù. mvinsch ´Â Ä¿¼­ÀÇ À§Ä¡¸¦ ¹Ù²Û ´ÙÀ½ insch ¿Í °°Àº ÀÛ¿ëÀ» ÇÑ´Ù. insertln Àº Ä¿¼­°¡ ÀÖ´Â ÁÙÀÇ À§¿¡ ºó ÁÙ(blank line)À» Çϳª Áý¾î³Ö´Â ´Ù. ±× ÁÙ ¹Ø¿¡ ÀÖ´Â ÁÙµéÀº ¸ðµÎ ÇÑ ÁÙ¾¿ ¹ØÀ¸·Î À̵¿ÇÑ´Ù. µû¶ó¼­ È­¸éÀÇ ¸Ç ¹Ø¿¡ ÀÖ´ø ÁÙÀº È­¸é»ó¿¡¼­ »ç¶óÁö°Ô µÈ´Ù. 10.11. ¿µ»ó ¼Ó¼º curses ¿¡¼­´Â ƯÁ¤ ¸ðµå·Î ±ÛÀÚ¸¦ È­¸é¿¡ ³ªÅ¸³»°í ½ÍÀ¸¸é ±× ¸ðµå¿¡ ÇØ´çÇÏ ´Â »ó¼ö¿Í ºñÆ®´ÜÀ§ OR ÇÏ¸é µÈ´Ù. addch(ch|A_BOLD); ´Â ch ¸¦ º¼µåü(bold;ÁÖÀ§ÀÇ ±Ûµéº¸´Ù ´õ ¹àÀº ¸ðµå) ·Î ³ªÅ¸³½´Ù. ÀÌ¿Ü¿¡µµ ¿©·¯°¡Áö ¸ðµå°¡ ÀÖ´Ù. A_STANDOUT ÀÌ ¸ðµå´Â ±ÛÀÚ¸¦ ÁýÁ߸ðµå·Î ³ªÅ¸³¾¶§ ¾²ÀδÙ. A_REVERSE ¿ªÀü ¸ðµå A_BOLD ±ÛÀÚµéÀÌ º¸¿ïµå·Î ³ªÅ¸³­´Ù. A_DIM ±ÛÀÚµéÀÌ ±âº»¸ðµåº¸´Ù ¾à°£ ¾îµÓ°Ô ³ªÅ¸³­´Ù. A_UNDERLINE ±ÛÀÚ ¹Ø¿¡ ¹ØÁÙÀÌ ±×¾îÁø ÇüÅ·Π³ªÅ¸³­´Ù. A_BLINK ±ÛÀÚµéÀÌ ¹Ý¦ÀδÙ. #include int atts; . . attrset(atts); attron(atts); attroff(atts); standout(); standend(); attrset Àº Ç¥ÁØ È­¸é»ó¿¡¼­ ¸ðµå¸¦ ÀÛµ¿½Ãų¶§ »ç¿ëÇÏ´Â ·çƾÀÌ´Ù. attron ·çƾÀº atts ¿¡ ÁÖ¾îÁø ¸ðµåµéÀ» ÀÛµ¿½ÃŲ´Ù. ÀÌ ·çƾÀº ¾Õ¿¡¼­ ÁöÁ¤µÈ ¸ðµå¸¦ ¹Ù²ÙÁö´Â ¾Ê´Â´Ù. ¸¶Âù°¡Áö·Î attroff ´Â ¼±ÅÃµÈ ¸ðµå¸¦ ÇØÁ¦ÇÑ´Ù. ±×¸®°í µÎ ·çƾ standout ¿Í standend ´Â °¢°¢ attron(A_STANDOUT) ¿Í attroff (A_STANDOUT) ¿Í µ¿ÀÏÇÑ ±â´ÉÀ» ÇÑ´Ù. 10.12. »õ À©µµ¿ì È­¸éÀÇ »ý¼º°ú Á¶ÀÛ »õ·Î¿î À©µµ¿ì¸¦ ´Ù·ç´Â ¹æ¹üÀ» ¼Ò°³ÇÑ´Ù. À©µµ¿ì¸¦ À§ÇÑ °¡Àå ±âº»ÀûÀÎ ·çƾ Àº newwin ÀÌ´Ù. #include WINDOW *win; int lines, cols, startline, startcol; . . win = newwin(lines, cols, startline, startcol); ÀÌ ·çƾÀ» ¼öÇà½ÃÅ°¸é ¼¼·Î Å©±â°¡ lines, °¡·Î Å©±â°¡ cols ÀÎ À©µµ¿ì°¡ »ý ±ä´Ù. wmove(win, y, x); ÀÌ ·çƾÀ» ¼öÇàÇϸé À©µµ¿ì win »óÀÇ ÇöÀç Ä¿¼­ À§Ä¡°¡ ÁÂÇ¥(x,y)·Î ¹Ù²î°Ô µÈ´Ù. ÀÌ ÁÂÇ¥´Â Ç¥ÁØ À©µµ¿ì stdscr Ç¥°¡ ¾Æ´Ï¶ó À©µµ¿ì win ÀÇ ¸ÇÀ­ÁÙ ¸Ç ¿ÞÂÊÀ» ±âÁØÀ¸·Î ÇÑ ÁÂÇ¥ÀÌ´Ù. wrefresh(win); Àº À©µµ¿ì win ¿¡ ÀÖ´Â ³»¿ëµéÀÌ ½ÇÁ¦ È­¸é¿¡ ³ªÅ¸³­´Ù. 10.13. curses ¿¹ : domenu -- »ý·« 10.14. Çϵå¿þ¾î ÀÇÁ¸ ´Ü¸»±â Á¶Á¤ : terminfo terminfo ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢ ´Ü¸»±âÀÇ Çϵå¿þ¾î¸¦ Á÷Á¢ Á¦¾îÇÏ ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. terminfo µ¥ÀÌŸº£À̽º¿¡´Â °¢ ´Ü¸»±âÀÇ Æ¯¼ºÀ» ¾òÀ» ¼ö ÀÖ´Ù. °¡Àå Å©°Ô ¹®Á¦°¡ ¹ß»ýÇÏ´Â °æ¿ì°¡ Æеù(padding, ¼Óµµ´ÊÃã)À» ÇÒ¶§´Ù. À̴ܾî´Â ´Ü¸»±â°¡ ÇÁ·Î±×·¥ÀÇ ¼Óµµ¸¦ Àû´çÈ÷ À¯ÁöÇϵµ·Ï Ãâ·Â¼Óµµ¸¦ ´ÊÃß´Â °ÍÀ» ÀǹÌÇÑ´Ù. #include #include main() { setupterm(0, 1, 0); putp(clear_screen); reset_shell_mode(); exit(0); } È­¸éÀ» ¹éÁö½ÃÅ°´Â ÇÁ·Î±×·¥ÀÌ´Ù. term.h¿¡´Â clear_screen À» Æ÷ÇÔÇÏ¿© ¿© ·¯°¡Áö ±â´ÉÀ» ³ªÅ¸³»´Â ¸ÅÅ©·ÎµéÀÌ Á¤ÀǵǾîÀÖ´Ù. setr-pterm Àº termino ÀÇ ÃʱâÈ­·çƾÀÌ´Ù. putp À» È£ÃâÇϸé È­¸éÀ» ¹éÁöÈ­½ÃÅ°±â´Â ¹®ÀÚ¿­À» È­¸é¿¡ ³» º¸³½´Ù. putp ´Â Á»´õ ÀϹÝÀûÀÎ ±â´ÉÀ» °®´Â ·çƾ tputs ÀÇ Á¦ÇÑµÈ ¹öÀüÀÌ´Ù. reset_shell_mode ´Â ´Ü¸»±â¸¦ ¿ø·¡ÀÇ »óÅ·ΠµÇµ¹¸°´Ù.