Proc ÆÄÀϽýºÅÛ ÇÁ·Î±×·¡¹Ö
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Docbook ¿ø¹®

Proc filesystem ÇÁ·Î±×·¡¹Ö

Proc filesystem ÇÁ·Î±×·¡¹Ö

À± »ó¹è

dreamyun@yahoo.co.kr

교정 과정
교정 0.82003³â 3¿ù 1ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º


1절. ¼Ò°³

À¯´Ð½º¿¡¼­ »ç¿ëµÇ´Â procÆÄÀÏ ½Ã½ºÅÛÀº ¿î¿µÃ¼Á¦ÀÇ °¢Á¾ Á¤º¸¸¦ Ä¿³Î¸ðµå°¡ ¾Æ´Ñ À¯Àú¸ðµå¿¡¼­ ½±°Ô Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾î ÁÜÀ¸·Î ½Ã½ºÅÛ Á¤º¸¸¦ ÀÏ¹Ý ÇÁ·Î±×·¡¸Ó°¡ ½±°Ô Á¢±Ù ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù.

ƯÈ÷ ¸®´ª½º¿¡¼­´Â ÇÁ·Î¼¼½º Á¤º¸»Ó¸¸ ¾Æ´Ñ ´Ù¸¥ ½Ã½ºÅÛ Á¤º¸µé±îÁö ±¤¹üÀ§ ÇÏ°Ô Á¦°øÇØ ÁØ´Ù. À̸»Àº procÆÄÀϽýºÅÛÀ» Á¦´ë·Î ÀÌÇØÇÒ °æ¿ì ¸®´ª½º ¿î¿µÃ¼Á¦¸¦ Á»´õ ±íÀÌ ÀÖ°Ô ´Ù·ê ¼ö ÀÖ´Ù´Â ¸»ÀÌ µÈ´Ù. ½ÇÁ¦ ps¿Í °°Àº ÇÁ·Î¼¼½º »óȲ°¨½Ã¿¡¼­ ºÎÅÍ, CPU»ç¿ëÀ², ÀÎÅÍ·´Æ®, ³×Æ®¿öÅ© ÆÐŶÀü¼Û·®, ÀûÀçµÈ ¸ðµâ, IDE-SCSI¿Í °°Àº ÀåÄ¡Á¤º¸, CPUÁ¤º¸µîÀÇ µ¥ÀÌÅ͸¦ ¾î·ÆÁö ¾Ê°Ô ¾ò¾î ¿Ã ¼ö ÀÖ´Ù. ´Ù¸¥ ´ëºÎºÐÀÇ À¯´Ð½º¿¡¼­ ÀÌ·¯ÇÑ Á¤º¸¸¦ ¾ò¾î¿Ã·Á¸é »ó´çÇÑ ¾Ö·Î»çÇ×À» °Ý°Ô µÉ°ÍÀÌ´Ù.

ÀÌÁ¦ procÆÄÀϽýºÅÛ¿¡¼­ µ¥ÀÌÅ͸¦ Àоî¿À´Â °ÍÀ» Áö³ª¼­ procÆÄÀÏ ½Ã½ºÅÛ¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ¾²´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.


2절. ¿Ö procÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇϴ°¡

¿ì¸®´Â ÀÌ¹Ì ÀÏ¹Ý ÆÄÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ³²±â´Â ¹æ¹ýÀ» ¾Ë°í ÀÖ´Ù. read(2), open(2), write(2) ÀÌ 3°³ÀÇ ÇÔ¼ö¸¸ »ç¿ëÇÒ ÁÙ ¾È´Ù¸é, ÇÊ¿äÇÑ ¸ðµç µ¥ÀÌÅ͸¦ ÀÐ°í ¾²´Âµ¥ º° ºÎÁ·ÇÔÀÌ ¾ø´Ù. ±×·¸´Ù¸é ¿Ö ±»ÀÌ procÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸µµ·Ï ÇϰڴÙ.


2.1절. ÆÄÀÏ ½Ã½ºÅÛ ¿À¹öÇìµå¸¦ ÁÙÀÏ ¼ö ÀÖ´Ù.

ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â ÆÄÀÏ ½Ã½ºÅÛÀº »ó´çÇÑ ¿À¹öÇìµå¸¦ °¡Áö°í ÀÖ´Ù. °¢ ÆÄÀÏÀÇ inode¿Í superblocks¿Í °°Àº °´Ã¼¸¦ °ü¸®ÇØ¾ß Çϸç ÀÌ·¯ÇÑ Á¤º¸¸¦ ÇÊ¿äÇÒ¶§ ¸¶´Ù ¿î¿µÃ¼Á¦¿¡ ¿äÃ»ÇØ¾ß ÇÑ´Ù. ÀÌµé ÆÄÀÏ ½Ã½ºÅÛÀÇ µ¥ÀÌÅ͵éÀº ¼­·Î ¾î±ß³¯¼öµµ ÀÖÀ¸¸ç, ´ÜÇöÈ­ Çö»óµîÀÌ ¹ß»ýÇÒ ¼öµµ ÀÖ´Ù. ¿î¿µÃ¼Á¦´Â ÀÌ·¯ÇÑ ¸ðµç °ÍÀ» °ü¸®ÇØ ÁÖ¾î¾ß Çϸç, ´ç¿¬È÷ »ó´çÇÑ ¿À¹öÇìµå°¡ ¹ß»ýÇÏ°Ô µÈ´Ù.

procÆÄÀÏ ½Ã½ºÅÛÀº ÀÌ·¯ÇÑ ÀÏ¹Ý ÆÄÀϽýºÅÛÀÇ ¹®Á¦Á¡À» ¾ø¾Ö±â À§Çؼ­ ¸®´ª½º Ä¿³Î¿¡¼­ Á÷Á¢ ÆÄÀϽýºÅÛÀ» °ü¸®ÇÏ´Â ¹æ¹ýÀ» äÅÃÇϰí ÀÖ´Ù.

Áö±Ý ¿©·¯ºÐÀÇ ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ mount¸í·ÉÀ» ³»¸®¸é ´ÙÀ½°ú °°ÀÌ proc ÆÄÀÏ ½Ã½ºÅÛÀÌ ÀÚµ¿À¸·Î ¸¶¿îÆ® µÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

# mount
/dev/hda7 on / type ext3 (rw)
none on /proc type proc (rw)
/dev/hda5 on /usr type ext3 (rw)
...
			
¿©·¯ºÐÀÌ ÃÖÃÊ¿¡ ¸®´ª½º ¿î¿µÃ¼Á¦¸¦ ¼³Ä¡ÇÒ ¶§ procÆÄÀÏ ½Ã½ºÅÛÀ» À§Çؼ­ º°µµ·Î ÆÄƼ¼ÇÀÛ¾÷À» ÇÑÀûÀÌ ¾øÀ» °ÍÀ̹ǷΠmountÁ¤º¸¿¡ Ç¥½ÃµÇ´Â°Ô ÀÌ»óÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÀÌÀ¯´Â ¾Õ¿¡¼­ ¸»ÇßµíÀÌ procÆÄÀÏ ½Ã½ºÅÛÀº ¸®´ª½º Ä¿³Î¿¡¼­ Á÷Á¢ °ü¸®ÇÏ´Â °ÍÀ¸·Î ¿î¿µÃ¼Á¦°¡ ºÎÆÃ µÇ¾úÀ» ¶§ »ý¼ºµÇ´Â ÆÄÀÏ ½Ã½ºÅÛÀ̱⠶§¹®ÀÌ´Ù. mountÁ¤º¸¸¦ º¸¸é ¾Ë°ÚÁö¸¸ ¾î¶² ÀåÄ¡¿¡µµ ¸¶¿îÆ®µÇ¾î ÀÖÁö ¾ÊÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. procÆÄÀÏ ½Ã½ºÅÛÀº Ä¿³Î¸Þ¸ð¸®¿¡¼­ µ¹¾Æ°¡´Â ÀÏÁ¾ÀÇ °¡»ó ÆÄÀÏ ½Ã½ºÅÛÀÌ´Ù.

¸Þ¸ð¸®¿¡¼­ ±×°Íµµ Ä¿³ÎÀÌ Á÷Á¢°ü¸®¸¦ ÇÏ°Ô µÇ´Ï.. ´ç¿¬È÷ ºü¸¦ ¼ö ¹Û¿¡ ¾ø´Ù.


2.2절. ¹°¸®ÀûÀÎ ÆÄÀϽýºÅÛ ÀåÄ¡¸¦ ÇÊ¿ä·Î ÇÏÁö¾Ê´Â´Ù

/proc´Â Ä¿³Î¸Þ¸ð¸®¿¡¼­ À¯ÁöÇÏ´Â ÆÄÀÏ ½Ã½ºÅÛÀÌ´Ù. ¶§¹®¿¡ º°µµÀÇ ÀåÄ¡(Çϵåµð½ºÅ© °°Àº)À» ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â´Ù. ÀÌ·¯ÇÑ Æ¯Â¡Àº ÀÓº£µðµå½Ã½ºÅÛÀ» ¼³°èÇϰíÀÚ ÇÒ¶§ Áß¿äÇÑ ¿ä¼Ò°¡ µÈ´Ù.


2.3절. ÃÖÀûÈ­µÈ ÆÄÀÏÀÛ¾÷ ¼öÇà

ÀϹÝÀûÀÎ ÆÄÀÏ ½Ã½ºÅÛ °èÃþÀº Àº ÇÁ·Î±×·¡¸Ó¸¦ À§Çؼ­ POSIX Çü½ÄÀÇ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. open, read, write, closeµîÀÌ À̰ÍÀÌ´Ù. µ¥ÀÌÅÍ ºí·°µéÀº ¿ëÀÌÇÑ È®ÀåÀ» À§Çؼ­ Ãß»óÈ­ µÇ¾î ÀÖÀ¸¸ç »ó¼Ó°¡´ÉÇÑ ÇüÅ·Π±¸¼ºµÈ´Ù.

ÀÌ·¯ÇÑ ÀÏ¹Ý ÆÄÀÏ ½Ã½ºÅÛÀº ´ë¿ë·®ÀÇ µ¥ÀÌÅ͸¦ ´Ù·ç¾î¾ß ÇÏ´Â °æ¿ì ¸Å¿ì À¯¿ëÇÏÁö¸¸, °íÁ¤ÀûÀ̰í ó¸®ÇؾßÇÒ µ¥ÀÌÅÍÀÇ ¾çÀÌ ÀûÀº ºÐ¾ß¿¡´Â ¿ÀÈ÷·Á ºñÈ¿À²ÀûÀÌ´Ù. procÆÄÀÏ ½Ã½ºÅÛ¿¡¼­ ´Ù·ç¾î¾ß ÇÒ Á¤º¸´Â ´ëºÎºÐ Á¤ÇØÁ® ÀÖÀ¸¸ç, µ¥ÀÌÅÍÀÇ ¾çµµ ±×¸® ¸¹Áö ¾Ê´Ù. °í·Î ÀÏ¹Ý ÆÄÀϽýºÅÛ¿¡¼­ Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏÁö ¾Ê°í ÇÊ¿äÇÑ ÀÛ¾÷¿¡ ÃÖÀûÈ­µÈ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.


3절. proc ÆÄÀϽýºÅÛÀ» ¾îµð¿¡ »ç¿ëÇÒ ¼ö ÀÖÀ»±î

2절¿¡¼­ proc ÆÄÀϽýºÅÛÀ» »ç¿ëÇßÀ» ¶§ ¾òÀ» ¼ö ÀÖ´Â ÀÕÁ¡¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. ±×·³ ¾î´À ¿ëµµ¿¡ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖÀ»Áö¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸ÀÚ.


3.1절. Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹Ö

procÆÄÀÏ ½Ã½ºÅÛ(ÀÌÇÏ proc) ÀÚü°¡ Ä¿³Î°ú ¹ÐÁ¢ÇÏ°Ô ¿¬°üÀÖ´Â ÀÌÀ¯·Î ÀÏ¹Ý ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ proc¸¦ »ç¿ëÇÏ´Â ÀÏÀº µå¹°´Ù. À§¿¡¼­ ¼³¸í ÇßµíÀÌ Ä¿³Î¸Þ¸ð¸®¿¡¼­ proc¸¦ À¯ÁöÇÏ°Ô µÇ¹Ç·Î ¸¹Àº ¾çÀÇ µ¥ÀÌÅ͸¦ ó¸®ÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¿ëµµ¿Í´Â ¸ÂÁö ¾Ê´Ù´Â Á¡µµ ÀÖ´Ù.

±×·±Á¡¿¡¼­ proc´Â Ä¿³Î¸ðµâ°ú °°ÀÌ Ä¿³Î°ú ¹ÐÁ¢ÇÏ°Ô °ü°èÀÖ´Â ÇÁ·Î±×·¥¿¡¼­ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. Ä¿³Î ¸ðµâ ÇÁ·Î±×·¥Àº ÁÖ·Î ÀåÄ¡¸¦ ¿Ã¸®±â À§ÇÑ ¿ëµµ·Î »ç¿ëµÇ´Âµ¥, Ä¿³Î ·¹º§¿¡¼­ ÀÛµ¿ÇÏ´Ù º¸´Ï ¸ðµâÀÇ ÀÛµ¿»óȲÀ̳ª ¼º´ÉµîÀ» ¾Ë¾Æ¿À±â°¡ ±×¸® ½±Áö ¾Ê´Ù. ±×·¸´Ù°í ÇØ¼­ ÀÏ¹Ý ÆÄÀÏ ½Ã½ºÅÛÀ» IPC¸¦ »ç¿ëÇÏ´Â °Í ¿ª½Ã ±×¸® ÁÁÀº »ý°¢Àº ¾Æ´Ï´Ù. ÀÌ·² ¶§ proc¸¦ ÀÌ¿ëÇÏ¸é ¹®Á¦¸¦ ±ò²ûÇÏ°Ô ÇØ°á ÇÒ ¼ö ÀÖ´Ù.


3.2절. ÀÓº£µðµå ÇÁ·Î±×·¡¹Ö

ÀÓº£µðµå ½Ã½ºÅÛÀº ÆÄÀÏ ½Ã½ºÅÛÀ» °¡ÁöÁö ¾Ê´Â °æ¿ì°¡ ¸¹°Å³ª °¡Áö°í ÀÖ´Ù°í ÇÏ´õ¶óµµ ¸Å¿ì Á¦ÇÑÀûÀÎ °æ¿ì°¡ ¸¹´Ù. ÀÌ·² ¶§ proc¸¦ ÀÌ¿ëÇØ¼­ °ü¸®ÀÚ È¯°æÀ̶óµçÁö µ¥ÀÌÅÍ ÀÔÃâ·Â ȯ°æÀ» ¸¸µé ¼ö ÀÖ´Ù.

¹°·Ð À̰æ¿ì´Â ¸®´ª½ºÄ¿³ÎÀ» ±â¹ÝÀÇ ÀÓº£µðµå ȯ°æ¿¡ ÇØ´çµÈ´Ù.


4절. proc ÇÁ·Î±×·¡¹Ö

À̹øÀå¿¡¼­´Â Ä¿³Î¿¡¼­ Á¦°øÇÏ´Â proc APIµé¿¡ ´ëÇØ¼­ »ìÆìº¼ °ÍÀÌ´Ù. ´Ù·ç¾î Áö´Â ³»¿ëµéÀº Ä¿³Î 2.4.x¸¦ ±âÁØÀ¸·Î Çϰí ÀÖ´Ù.


4.1절. proc ±¸Á¶Ã¼ ¹× API

4.1.1절. proc_dir_entry ±¸Á¶Ã¼

proc¿¡ À־ °¡Àå Áß¿äÇÑ ±¸Á¶Ã¼·Î½á ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

struct proc_dir_entry {
    unsigned short low_ino;
    unsigned short namelen;
    const char *name;
    mode_t mode;
    nlink_t nlink;
    uid_t uid;
    gid_t gid;
    unsigned long size;
    struct inode_operations * proc_iops;
    struct file_operations * proc_fops;
    get_info_t *get_info;
    struct module *owner;
    struct proc_dir_entry *next, *parent, *subdir;
    void *data;
    read_proc_t *read_proc;
    write_proc_t *write_proc;
    atomic_t count;     /* use count */
    int deleted;        /* delete flag */
    kdev_t  rdev;
};
				
nameÀº procÆÄÀÏÀÇ À̸§ÀÌ´Ù. mode´Â procÆÄÀÏÀÇ ±ÇÇÑÀ¸·Î ÀÏ¹ÝÆÄÀÏ¿¡ »ç¿ëµÇ´Â ±ÇÇѰú µ¿ÀÏÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. mode¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº stat(2)ÀÇ manÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.

struct proc_dir_entry *next ...´Â procÆÄÀÏÀÌ À§Ä¡ÇÏ´Â µð·ºÅ丮·Î ÀÏ¹Ý ÆÄÀÏ¿¡¼­ÀÇ µð·ºÅ丮 ±ÇÇѰú µ¿ÀÏÇÏ°Ô »ç¿ëµÇ¸ç, ¸µÅ©µå ¸®½ºÆ®·Î °ü¸®µÈ´Ù.

data proc¿¡¼­ ÀÐÀº µ¥ÀÌÅ͸¦ ¸®ÅÏÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù.

read_proc, write_proc À¯Àú¿µ¿ªÀÇ ÇÁ·Î¼¼½º´Â Á÷Á¢ Ä¿³Î¿µ¿ª¿¡ µ¥ÀÌÅ͸¦ Àаųª ¾µ¼ö ¾ø´Ù. ¶§¹®¿¡ ¸ðµâ ÇÁ·Î±×·¥µîÀÌ Áß°£¿¡¼­ Ä¿³Î°ú À¯Àú¿µ¿ª »çÀÌÀÇ µ¥ÀÌÅÍÀü´ÞÀ» ÇØÁÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ µ¥ÀÌÅÍ Àü´ÞÀº callbackÇÔ¼ö¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. read_proc´Â Ä¿³Î·Î ºÎÅÍ ÀÐÀº µ¥ÀÌÅ͸¦ À¯Àú¿µ¿ª ÇÁ·Î¼¼½º·Î µÇµ¹·ÁÁÖ±â À§Çؼ­ write_proc´Â À¯Àú¿ª¿ª ÇÁ·Î¼¼½º¿¡¼­ ¾´µ¥ÀÌÅ͸¦ Ä¿³Î¸Þ¸ð¸® ¿µ¿ªÀ¸·Î º¹»çÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.


4.2절. proc API

proc´Â »ç¿ëÇϱ⠰£´ÜÇÑ ¸î°³ÀÇ API¸¸À» Á¦°øÇϴµ¥, À̵é API´Â Ä¿³ÎÀÇ ¸ÞÀÌÀú ¹öÁ¯¿¡ µû¶ó¼­ Â÷À̰¡ ÀÖÀ» ¼ö ÀÖ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ 2.4.x¿ÜÀÇ ´Ù¸¥ Ä¿³Î ¹öÁ¯À» »ç¿ëÇÏ±æ ¿øÇÑ´Ù¸é ÇØ´ç Ä¿³Î¹öÁ¯ÀÇ Ä¿³Î ¹®¼­¸¦ Âü°íÇØ¾ß ÇÒ °ÍÀÌ´Ù. ±×·¸´Ù°í ÇØ¼­ ÀÌ ¹®¼­°¡ ÀüÇô ÇÊ¿ä ¾øÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ´ëºÎºÐÀÇ °æ¿ì Ä¿³ÎÀÇ ¸ÞÀÌÀú ¹öÁ¯ÀÌ ¾÷±×·¹ÀÌµå µÈ´Ù°í ÇÏ´õ¶óµµ ÇÔ¼ö API°¡ ¾ÆÁÖ Å©°Ô º¯ÇÏ´Â °æ¿ì´Â ¾ø±â ¶§¹®ÀÌ´Ù. ÀÌ ¹®¼­¸¦ ÀÍÇô ³õ´Â´Ù¸é ´Ù¸¥ Ä¿³Î ¹öÁ¯¿¡µµ ½±°Ô ÀûÀÀÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


4.2.1절. create_proc_entry

struct proc_dir_entry *create_proc_entry
(
    const char *name,
    mode_t     mode,
    struct proc_dir_entry *parent);
);
				
ÀÌ ÇÔ¼ö´Â ù¹øÂ° ÀÎÀÚÀÎ nameÀ» À̸§À¸·Î ÇÏ´Â procÆÄÀÏÀ» »ý¼ºÇÑ´Ù. mode´Â »ý¼º µÉ¶§ÀÇ ÆÄÀÏ ¸ðµå·Î open(2)¿¡ »ç¿ëµÇ´Â °Í°ú µ¿ÀÏÇÏ°Ô »ç¿ëµÈ´Ù. mode¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº manÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.

¸¶Áö¸· ÀÎÀÚÀÎ parent´Â name·Î ¸¸µé¾îÁø procÆÄÀÏÀÌ À§Ä¡ÇÒ µð·ºÅ丮´Ù. procÆÄÀÏÀº ·çÆ®µð·ºÅ丮°¡ "/"¾Æ´Ñ "/proc"¿¡¼­ ºÎÅÍ ½ÃÀÛÇÏ°Ô µÈ´Ù. ¸¸¾à NULLÀ̶ó¸é /proc µð·ºÅ丮 ¹Ø¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù.


4.2.2절. create_proc_read_entry

static inline
struct proc_dir_entry *create_proc_read_entry
(
    const char *name,
    mode_t mode,
    struct proc_dir_entry *base,
    read_proc_t * read_proc, 
    void *data
);
				
ÀÌ ÇÔ¼ö´Â create_proc_entryÀÇ Æ÷Àå(wrapper)ÇÔ¼ö´Ù.
static inline
struct proc_dir_entry *create_proc_read_entry
(
    const char     *name,
    mode_t         mode,
    struct proc_dir_entry *base,
    read_proc_t  *read_proc, 
    void         *data
)
{
    struct proc_dir_entry *res = create_proc_entry(name, mode, base);
    if (res)
    {
        res->read_proc = read_proc;
        res->data=data;
    }
   return res;
}
				
create_proc_read_entry´Â ½±°Ô Àбâ¿ë procÆÄÀÏÀ» ¸¸µé ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù.


4.2.3절. create_proc_info_entry

static inline 
proc_dir_entry *create_proc_info_entry
(
    const char *name,
    mode_t     mode,
    get_info_t *get_info
);
				
¸¶Âù°¡Áö·Î create_proc_entryÀÇ Æ÷ÀåÇÔ¼öÀÌ´Ù.
ststic inline
struct proc_dir_entry *create_proc_info_entry
(
    const char            *name,
    mode_t                mode,
    struct proc_dir_entry *base,
    get_info_t            *get_info
)
{
    struct proc_dir_entry *res = create_proc_entry (name, mode, base);
    if (res) res->get_info = get_info;
    return res;
}
				


4.2.4절. proc_mkdir

procÆÄÀÏ ½Ã½ºÅÛ¿¡ µð·ºÅ丮¸¦ »ý¼ºÇÑ´Ù. ¸¸µé¾î Áö´Â µð·ºÅ丮´Â procÆÄÀÏ ½Ã½ºÅÛÀÇ ÃÖ»óÀ§ µð·ºÅ丮(/proc)¸¦ ±âÁØÀ¸·Î ÇÑ´Ù.

extern struct proc_dir_entry *proc_mkdir
(
    const char *dir_name,
    struct proc_dir_entry *parent
) 
				


4.2.5절. proc_symlink

½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µé±â À§Çؼ­ »ç¿ëµÈ´Ù. ´ÜÁö ½ÇÁ¦ »ç¿ëÀÚ(real user)¸¸ÀÌ »ç¿ë°¡´ÉÇÏ´Ù.

extern struct proc_dir_entry *proc_symlink
(
    const char    *file_name,
    struct proc_dir_entry *parent,
    const char    *symlink_name  
);
				


4.2.6절. remove_proc_entry

Ä¿³Î ¸ðµâ ÇÁ·Î±×·¥¹Ö½Ã celanup_module()ÇÔ¼ö¿¡¼­ proc ÆÄÀÏÀ» Áö¿öÁÖÁö ¾ÊÀ» °æ¿ì ½Ã½ºÅÛ¿¡ ÁÁÁö ¾ÊÀº ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Ù. ÀÏ´Ü proc¸¦ »ý¼ºÇß´Ù¸é ÇÁ·Î±×·¥ Á¾·á½Ã ¹Ýµå½Ã ÀÌ ÇÔ¼ö¸¦ È£ÃâÇØ¼­ procÆÄÀÏÀ» Áö¿öÁÖµµ·Ï ÇÏÀÚ.

extern void *remove_proc_entry
(
    const char            *name,
    struct proc_dir_entry parent
);
				


4.3절. ±âŸ Æ÷Àå ÇÔ¼öµé

¸ðµâ ÇÁ·Î±×·¡¹Ö½Ã procÆÄÀÏ ½Ã½ºÅÛÀº ¸Å¿ì ÀÚÁÖ ÀÌ¿ëµÈ´Ù. ±×·¯¹Ç·Î ÀÌ¿ÕÀÌ¸é ¾²±âÆíÇÑ ÇÔ¼öµéÀÌ ÁغñµÇ¸é ÁÁÀ» °ÍÀÌ´Ù. ¿©±â¿¡¼­ ¼³¸íÇÏ´Â ÇÔ¼öµéÀº ±âÁ¸ÀÇ procÇÔ¼öµéÀ» »ç¿ëÇÏ±â ÆíÇϵµ·Ï Æ÷ÀåÇÑ ÇÔ¼öµéÀÌ´Ù.


4.3.1절. proc_net_create

ÀÌ ÇÔ¼ö´Â create_proc_info_entryÀÇ /proc/netÁ¤º¸¿¡ ´ëÇÑ Æ÷ÀåÇÔ¼öÀÌ´Ù. ³×Æ®¿öÅ© ¼­ºê½Ã½ºÅÛ¿¡ ´ëÇØ¼­ ½±°Ô Á¢±ÙÇϵµ·Ï µµ¿ÍÁØ´Ù.

static inline
struct proc_dir_entry *proc_net_create
(
    const char *name,
    mode_t     mode,
    get_info_t *get_info
)
{
    return create_proc_info_entry(name, mode, proc_net, get_info);
}
				


4.3.2절. proc_net_remove

³×Æ®¿öÅ© ¼­ºê ½Ã½ºÅÛ¿¡ ´ëÇÑ remove_proc_entryÀÇ Æ÷ÀåÇÔ¼öÀÌ´Ù.

static inline void proc_net_remove(const char *name)
{
    remove_proc_entry(name, proc_net)
}
				


4.4절. ÀÏ¹Ý À¯Àú¿ÍÀÇ µ¥ÀÌÅÍ ±³È¯

ÀÏ¹Ý ÆÄÀÏ¿¡¼­ À¯Àú¿ÍÀÇ µ¥ÀÌÅÍ ±³È¯Àº ¸Å¿ì ´Ü¼øÇϸç, º°·Î ½Å°æ¾µ Çʿ䵵 ¾ø´Ù. ÇÁ·Î±×·¥ÀÌ ÆÄÀÏ¿¡ ¾´ ³»¿ë ±×´ë·Î¸¦ À¯Àú°¡ º¸¸ç, À¯Àú°¡ ÆÄÀÏ¿¡ ¾´ ³»¿ë±×´ë·Î¸¦ ´Ù½Ã ÇÁ·Î±×·¥ÀÌ ÀоîµéÀδÙ.

±×·¯³ª procÆÄÀÏ ½Ã½ºÅÛ¿¡¼­ÀÇ µ¥ÀÌÅÍ´Â ½ÇÁ¦ ÆÄÀÏ¿¡ ÀúÀåµÇ´Â °Í°ú´Â ´Þ¸® Ä¿³Î¸Þ¸ð¸®¿¡ ÀúÀåµÈ´Ù. ¾Ë´Ù ½ÃÇÇ Ä¿³Î¸Þ¸ð¸®´Â À¯Àú·¹º§ ¿¡¼­ Á÷Á¢ Á¢±ÙÇÒ ¼ö ¾ø´Ù. À¯Àú°¡ cat(ȤÀº readÇÔ¼ö)µîÀ» ÅëÇØ¼­ ÆÄÀÏÀÇ ³»¿ëÀ» ÀÐÀ»·Á°í Çϸé Ä¿³Î¿¡¼­ µ¥ÀÌÅ͸¦ À¯Àú¿¡°Ô ÀÏÁ¤ÇÑ Æ÷¸ËÀ¸·Î »Ñ·ÁÁÖ°Ô µÈ´Ù. ¸¶Âù°¡Áö·Î À¯Àú°¡ ¾î¶² ³»¿ëÀ» procÆÄÀÏ¿¡ ¾²°ÔµÇ¸é µ¥ÀÌÅ͸¦ ¹Þ¾ÆµéÀÎÈÄ °¡°øÇؼ­ Ä¿³Î¸Þ¸ð¸®¿¡ ÀûÀçÇÏ°Ô µÈ´Ù.

À̸¦ À§Çؼ­ Ä¿³Î°ú ÀϹÝÀ¯Àú »çÀÌ¿¡ µ¥ÀÌÅ͸¦ ¼­·Î¿¡°Ô Àü´ÞÇØ ÁÖ´Â ¾î¶² ÇÔ¼ö°¡ ÇÊ¿äÇϰí ÀÌ ÇÔ¼ö°¡ ´Ù·ê ¼ö Àִ ǥÁØÀûÀÎ ÀڷᱸÁ¶°¡ ÀÖ¾î¾ß ÇÑ´Ù. À¯Àú°¡ µ¥ÀÌÅ͸¦ ÀÐ°í ¾²±â À§Çؼ­´Â Àбâ¿Í ¾²±â¸¦ À§ÇÑ callbackÇÔ¼ö¸¦ µî·Ï½ÃÄѼ­ »ç¿ë ÇØ¾ßÇÑ´Ù.

struct proc_dir_entry *entry;

entry->read_proc = read_proc_foo;
entry->write_proc = write_proc_foo;
			
À§¿¡¼­ ó·³ pric_dir_entry¿¡ Àбâ/¾²±â¸¦ À§ÇÑ ÄݹéÇÔ¼ö¸¦ µî·ÏÇÏ¸é µÈ´Ù.


4.4.1절. µ¥ÀÌÅÍ Àбâ

ÄݹéÇÔ¼ö·Î µî·ÏµÇ´Â ÀбâÇÔ¼ö´Â À¯Àú¿µ¿ª ÇÁ·Î¼¼½ºÀÇ ¿äûÀ» ¹ÞÀ¸¸é Ä¿³Î·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àоîµé¿©¼­ ¾Ë¸ÂÀº Æ÷¸ËÀ¸·Î º¯°æÇÑ´ÙÀ½ À¯Àú¿µ¿ª ÇÁ·Î¼¼½º·Î µÇµ¹·ÁÁØ´Ù. ÀбâÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¸ð½ÀÀ» °¡Áø´Ù.

int read_func(char* page, char** start, off_t off, int count, int* eof, void* data);
				
ÀбâÇÔ¼ö´Â ÀϾîµéÀÎ Á¤º¸¸¦ page¿¡ ¾²°Ô µÈ´Ù.


4.4.2절. µ¥ÀÌÅÍ ¾²±â

¾²±â ÄݹéÇÔ¼ö´Â À¯Àú¿µ¿ª ÇÁ·Î¼¼½º·Î ºÎÅÍ µ¥ÀÌÅ͸¦ ¹ÞÀº´ÙÀ½ Ä¿³ÎÀÌ Àб⿡ Àû´çÇÑ Çü½ÄÀ¸·Î º¯°æÈÄ Ä¿³Î¿¡ ³Ñ°ÜÁØ´Ù. ¾²±âÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¸ð½ÀÀ» °¡Áø´Ù.

int write_func(struct file* file, const char *buffer, unsigned long count,
			void *data);
				
¾²±âÇÔ¼ö´Â buffer·Î ºÎÅÍ À¯Àú°¡ ¾´ µ¥ÀÌÅ͸¦ ÀоîµéÀδÙ. buffer´Â À¯Àú µ¥ÀÌÅÍ À̹ǷΠcopy_from_userÀ» ÀÌ¿ëÇØ¼­ Ä¿³Î¸Þ¸ð¸®¿µ¿ªÀ¸·Î µ¥ÀÌÅ͸¦ º¹»çÇÑ´Ù.


4.5절. ProcÆÄÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇÑ ¿¹Á¦

±×·³ °£´ÜÇÑ ¿¹Á¦¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ¿¹Á¦´Â ÀÏ¹Ý ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¾Æ´Ñ Ä¿³Î ¸ðµâ ÇÁ·Î±×·¥ÀÌ´Ù. Ä¿³Î ¸ðµâÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ³»¿ëÀº Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹ÖÀ» Âü°íÇϱ⠹ٶõ´Ù.

ÇÁ·Î±×·¥ÀÇ À̸§Àº my_proc.c·Î ÇϰڴÙ. ÀÌ ¸ðµâÀº procÆÄÀÏ ½Ã½ºÅÛ¿¡ myproc¶ó´Â µð·ºÅ丮¸¦ ¸¸µé°í ÀÌ ¸ðµâ ¾Æ·¡¿¡ foo¿Í jiffies¶ó´Â ÆÄÀÏÀ» ¸¸µç´Ù. ¸¸¾à À¯Àú°¡ catµîÀ» ÅëÇØ¼­ ÀÌµé ÆÄÀÏÀ» ¿­¸é ¸ðµâÀº ¸ðµâ Á¤º¸¸¦ Àû´çÇÑ Æ÷¸ËÀ¸·Î ¸¸µé¾î¼­ »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÖ°Ô µÈ´Ù. fooÆÄÀÏÀÇ °æ¿ì¿¡´Â ÆÄÀÏ¿¡ ³»¿ëÀ» ¾µ¼öµµ ÀÖµµ·Ï µÇ¾î À־ »ç¿ëÀÚ°¡ ³»¿ëÀ» ¹Ù²Ù¸é ÀÌ ³»¿ëÀº ¸ðµâ¿¡¼­ ÀÐ¾î µéÀÌ°Ô µÈ´Ù.

¿©·¯ºÐÀÌ Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ÀÌÇØ°¡ ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ. ¸ðµâ¿¡¼­ main()ÇÔ¼ö¿¡ ÇØ´çÇÏ´Â module_init()ÇÔ¼ö¿¡¼­ Â÷±ÙÂ÷±Ù ºÐ¼®Çسª°¡¸é Á»´õ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¿¹Á¦ : myproc.c

#include <linux/module.h>
#include <linux/tty.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <asm/uaccess.h>

#define MODULE_VERSION	"1.0"

// ¸ðµâÀÇ À̸§ÀÌ´Ù. 
// ÀÌ ¸ðµâÀ̸§À¸·Î /proc¹Ø¿¡ µð·ºÅ丮°¡ »ý¼ºµÈ´Ù. 
#define MODULE_NAME		"myproc"

// »ý¼ºµÈ /proc/MODULE_NAME ¹Ø¿¡ ¾Æ·¡ 2°³ÀÇ ÆÄÀÏÀÌ 
// »ý¼ºµÈ´Ù. 
#define FOO_FILE		"foo"
#define JIFFIE_FILE		"jiffies" 

#define FOOBAR_LEN 8

// foo ÆÄÀÏ¿¡ ÀúÀåµÉ µ¥ÀÌÅÍ ±¸Á¶Ã¼
struct fb_data_t
{
	char name[FOOBAR_LEN + 1];
	char value[FOOBAR_LEN + 1];
};
struct fb_data_t foo_data;


static struct proc_dir_entry *example_dir, *foo_file, *jiffies_file;

// »ç¿ëÀÚ°¡ catµîÀ» ÅëÇØ¼­ /proc/[MODULE_NAME]/jiffiesÆÄÀÏÀ» ¿­¸é 
// Ä¿³ÎÀº ÀÌ ÇÔ¼ö¸¦ È£ÃâÇØ¼­ ÇØ´ç Á¤º¸¸¦ ³Ñ°ÜÁØ´Ù. 
static int proc_read_jiffies(char *page, char **start, off_t off,
			   int count, int *eof, void *data)
{
	int len;

	MOD_INC_USE_COUNT;
	// »ç¿ëÀÚ°¡ ÀÌÇØÇϱ⠽¬¿î Æ÷¸ËÀ¸·Î ¸¸µç´Ù. 
	// cat, viµîÀ» »ç¿ëÇØ¼­ ÀÌ ÆÄÀÏÀ» ¿­°æ¿ì 
	// jiffies = 1234 ¿Í °°Àº Çü½ÄÀ¸·Î º¸ÀδÙ. 
	len = sprintf(page, "jiffies = %ld\n", jiffies);
	// ÇØ´ç ³»¿ëÀ» printk¸¦ ÅëÇØ¼­ ·Î±×·Î ³²±ä´Ù.  
	// ÀÌ µ¥ÀÌÅÍ´Â /var/log/message·Î Ãâ·ÂµÈ´Ù.
	printk("<1> read jiffies = %ld\n", jiffies);
	MOD_DEC_USE_COUNT;

	return len;
}

// »ç¿ëÀÚ°¡ /proc/[MODULE_NAME]/foo ÆÄÀÏÀ» ¿­¾úÀ» ¶§ 
// Ãâ·ÂÇØÁÖ´Â Á¤º¸ 
static int proc_read_foobar(char *page, char **start, off_t off, 
							int count, int *eof, void *data)
{
	int len;
	struct fb_data_t *fb_data = (struct fb_data_t *)data;

	MOD_INC_USE_COUNT;
	// fb_data±¸Á¶Ã¼ÀÇ ³»¿ëÀ» º¸½Ã½±°Ô ¸¸µé¾î¼­ Ãâ·ÂÇØÁØ´Ù. 
	len = sprintf(page, "%s = %s",
					fb_data->name, fb_data->value);
	MOD_DEC_USE_COUNT;
	return len;
}

// »ç¿ëÀÚ´Â /proc/[MODULE_NAME]/foo¿¡ ³»¿ëÀ» ¾²±â¸¦ ¿øÇÒ¶§µµ ÀÖÀ» °ÍÀÌ´Ù.
// ÀÌ ¶§ ÀÌÇÔ¼ö°¡ È£ÃâµÈ´Ù.
static int proc_write_foobar(struct file *foke, const char *buffer,
							unsigned long count, void *data)
{
	int len;
	struct fb_data_t *fb_data = (struct fb_data_t *)data;

	MOD_INC_USE_COUNT;
	if (count > FOOBAR_LEN)
		len = FOOBAR_LEN;
	else
		len = count;

	printk("<1> DATA COPY %d\n", len);
	// echo "xxxxx" > /proc/[MODULE_NAME]/foo µîÀ¸·Î ÀԷ¹ÞÀº °ªÀ»
	// fb_data->value¿¡ ÀúÀåÇÑ´Ù. 
	if (copy_from_user(fb_data->value, buffer, len))
	{
		MOD_DEC_USE_COUNT;
		return -EFAULT;
	}

	fb_data->value[len] = 0x00;
	MOD_DEC_USE_COUNT;

	return len;

}

// Ä¿³Î ¸ðµâ ÃʱâÈ­ ÇÔ¼ö
static int init_myproc(void)
{
	int rv = 0;

	printk("<1> Module Start\n");
	example_dir = proc_mkdir(MODULE_NAME, NULL);
	if (example_dir == NULL)
	{
		rv = -ENOMEM;
		printk("<1> mkdir failure\n");
		goto out;
	}

	// JIFFILEÆÄÀÏÀÇ °æ¿ì ´ÜÁö Àб⸸ Çã¿ëÇÑ´Ù.
	example_dir->owner = THIS_MODULE;
	jiffies_file = create_proc_read_entry(JIFFIE_FILE, 0444, example_dir,
									proc_read_jiffies, NULL);
	if (jiffies_file == NULL)
	{
		rv = -ENOMEM;
		printk("<1> read entry failure\n");
		goto no_jiffies;
	}
	printk("<1> OK MAKE MODULE\n");
	jiffies_file->owner = THIS_MODULE; 

	// FOO_FILEÀÇ °æ¿ì Àбâ¿Í ¾²±â ¸ðµÎ °¡´ÉÇØµµ·Ï ÇØ¾ß Çϸç 
	// °¢°¢ÀÇ °æ¿ì¿¡ È£ÃâµÉ ÇÔ¼ö¸¦ ÁöÁ¤ÇØ Áà¾ß ÇÑ´Ù. 
	foo_file = create_proc_entry(FOO_FILE, 0644, example_dir);
	if (foo_file == NULL)
	{
		rv = -ENOMEM;
		goto no_foo;
	}

	strcpy(foo_data.name, "foo");
	strcpy(foo_data.value, "dream");

	// Ä¿³Î ÀڷᱸÁ¶¿¡ ÀúÀåµÉ µ¥ÀÌÅÍ 
	foo_file->data = &foo_data;
	// Àб⸦ ¿äûÇßÀ» ¶§ È£ÃâµÉ ÇÔ¼ö
	foo_file->read_proc = proc_read_foobar;
	// ¾²±â°¡ ¿äûµÇ¾úÀ» ¶§ È£ÃâµÉ ÇÔ¼ö
	foo_file->write_proc = proc_write_foobar;
	foo_file->owner = THIS_MODULE;

	printk("<1> %s %s initialised\n", "myproc", "1.0");

	// Á¦´ë·Î ÃʱâÈ­°¡ ÀÌ·ç¾îÁ³´Ù¸é 0À» ¸®ÅÏÇØ¾ß ÇÑ´Ù. 
	return 0;
	no_foo:
		remove_proc_entry(FOO_FILE, example_dir);
	no_jiffies:
		remove_proc_entry(MODULE_NAME, NULL);
	out:
		return rv;
}

// cleanup ÇÔ¼ö
static void cleanup_myproc(void) 
{
	printk("<1> END\n"); 
	remove_proc_entry(FOO_FILE, example_dir);
	remove_proc_entry(JIFFIE_FILE, example_dir);
}

module_init(init_myproc);
module_exit(cleanup_myproc);

MODULE_AUTHOR("yundream");
MODULE_DESCRIPTION("Sanmpe proc");
			

´ÙÀ½Àº À§ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ Çϱâ À§ÇÑ makeÆÄÀÏÀÌ´Ù.

Makefile

WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes    
INCLUDE := -isystem /lib/modules/`uname -r`/build/include    
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}    
CC      := gcc                                 
TARGET  := my_proc 
     
my_proc.o: my_proc.c
	${CC} ${CFLAGS} -c my_proc.c 
                                     
.PHONY: clean                                                      
                                          
clean:                                    
	rm -rf ${TARGET}.o    
			

insmod¸¦ ÀÌ¿ëÇØ¼­ ¸ðµâÀ» ¿Ã¸°ÈÄ cat, echo µîÀ» ÅëÇØ¼­ Á÷Á¢ Å×½ºÆ®°¡ °¡´ÉÇÏ´Ù.

# echo "okok" > /proc/myproc/foo
# cat /proc/myproc/foo
foo = okok 
			
ÀÛ¼ºµÈ ¸ðµâÇÁ·Î±×·¥ÀÇ ÀÛµ¿»óȲÀº /var/log/messageÀÇ ³»¿ëÀ» È®ÀÎÇÏ¸é µÈ´Ù. ¸¸¾à syslog¿Í klogd°¡ ¶°ÀÖ´Ù¸é tailµîÀÇ µµ±¸¸¦ ÀÌ¿ëÇØ¼­ ¸ðµâÀÛµ¿»óȲÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

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