sms ÇÁ·Î±×·¥ ¸¸µé±â ÇÁ·ÎÁ§Æ®
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Docbook ¿ø¹®

Kernel 2.6¿¡¼­ stat Á¤º¸°¡ ¹Ù²ñ

cpu  160973516 140668 193307293 2350842518 97711250 250076 1915952 0 
cpu0 76866807 59063 92916755 1182630432 49046887 114166 936567 0 
cpu1 84106709 81605 100390538 1168212086 48664363 135910 979385 0 
 
Kernel 2.4¿¡¼­¿Í´Â ´Þ¸®, 4°³ÀÇ Çʵ尡 ´õ Ãß°¡µÇ¾ú´Ù. °¢°¢ÀÇ Çʵ尡 ÀǹÌÇÏ´Â ¹Ù´Â ´ÙÀ½°ú °°´Ù.
  • user : user ¸ðµå¿¡¼­ÀÇ ÇÁ·Î¼¼½º ½ÇÇà½Ã°£
  • nice : user ¸ðµå¿¡¼­ÀÇ niced ÇÁ·Î¼¼½º ½ÇÇà½Ã°£
  • system : Ä¿³Î ¸ðµå¿¡¼­ÀÇ ÇÁ·Î¼¼½º ½ÇÇà½Ã°£
  • idle : ³í½Ã°£
  • iowait : I/O°¡ ¿Ï·áµÇ±â¸¦ ±â´Ù¸° ½Ã°£
  • irq : servicing interrupts
  • softirq : servicing softirqs
ÀÌ ³»¿ëÀ» docbook¿¡ Ãß°¡Çϵµ·Ï ÇÑ´Ù.

sms Á¦ÀÛ±â

proc¸¦ ÀÌ¿ëÇÑ sms Á¦ÀÛ

À± »ó¹è

dreamyun@yahoo.co.kr

교정 과정
교정 0.82003³â 6¿ù 13ÀÏ 19½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º


1절. ¼Ò°³

±×µ¿¾È ¸î ¹ø¿¡ °ÉÃļ­ /procÆÄÀϽýºÅÛ¿¡ °üÇÑ ¿¬Àçµµ Çß¾ú°í °ü·ÃµÇ¾î¼­ smsÁ¤º¸¸¦ °¡Á®¿À´Â °­Áµµ ¸¶·ÃÇß¾ú´Ù. À̹ø¿¡´Â Á»´õ Æø³ÐÀº ½Ã½ºÅÛÁ¤º¸¸¦ °¡Á®¿À´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸±â·Î Çß´Ù.

ÀÌ ÇÁ·Î±×·¥Àº ¸®´ª½º kernel-2.4.x¿¡¼­ ÄÚµù/Å×½ºÆ® µÇ¾úÀ¸¸ç, ´Ù¸¥ À¯´Ð½ºµé¿¡¼­´Â ÀÛµ¿ÇÏÁö ¾ÊÀ»°ÍÀÌ´Ù.


2절. jsms ¼Ò°³

¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥ÀÇ À̸§Àº jsmsÀ¸·Î Á¤Çß´Ù. joinc+sms(-.-;)ÀÇ ÁÙÀÓ¸»ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ½Ã½ºÅÛ°ü¸®¸¦ ¸ñÀûÀ¸·Î »ç¿ëÇÏ´Â df, freeµî°ú À¯»çÇÑ Á¤º¸¸¦ ¾ò¾î¿Ã °ÍÀÌ´Ù.

Áï µð½ºÅ©Á¤º¸, ¸Þ¸ð¸®Á¤º¸, CPU»ç¿ëÀ² µîÀÇ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.


2.1절. ½Ã½ºÅÛÁ¤º¸ ¼öÁý ¹æ¹ý

°¢°¢ÀÇ ½Ã½ºÅÛ Á¤º¸µéÀº ´ëºÎºÐ /procÆÄÀϽýºÅÛ¿¡ ÀÖ´Â ÆÄÀϵéÀ» ºÐ¼®ÇÔÀ¸·Î½á ¾ò¾î¿À°Ô µÈ´Ù. À̹ø Àå¿¡¼­´Â °¢°¢ÀÇ Á¤º¸º°·Î ¾î¶²½ÄÀ¸·Î µ¥ÀÌŸ¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇϵµ·Ï ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¼³¸íÀº ½ÇÁ¦ ÀÛµ¿µÇ´Â Äڵ带 ¿¹Á¦·Î ¸¸µé¾î°¡¸é¼­ ÀÌ·ç¾îÁö°Ô µÉ°ÍÀÌ´Ù.

ÀÌ·¯ÇÑ °¢°¢ÀÇ ¿¹Á¦ÄÚµåµéÀº ³ªÁß¿¡ jsms¿¡ ÅëÇÕµÇ°Ô µÉ°ÍÀÌ´Ù.


2.1.1절. ¸Þ¸ð¸® Á¤º¸

¸Þ¸ð¸®´Â Å©°Ô ¹°¸®Àû¸Þ¸ð¸®¿Í Swap¸Þ¸ð¸®·Î ±¸¼ºµÇ¸ç, ¿ì¸®´Â ÀÌµé ¸ðµÎ¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Á®¿Ã ¼ö ÀÖ¾î¾ß ÇÑ´Ù. °¡Á®¿Ã µ¥ÀÌŸ´Â ÇÒ´çµÈ Àüü ºí·°Å©±â, »ç¿ëµÇ´Â ºí·°Å©±â, »ç¿ëÇÒ¼ö ÀÖ´Â ºí·°Å©±â, shared, buffers, cachedµÈ ºí·° Å©±âÀÌ´Ù.

ÀÌ·¯ÇÑ ¸Þ¸ð¸® Á¤º¸´Â /procÆÄÀϽýºÅÛ¿¡ ÀÇÇØ¼­ ÆÄÀÏ·Î Á¦°øµÇ¾îÁø´Ù. ¸Þ¸ð¸® Á¤º¸¸¦ °¡Áö´Â ÆÄÀÏÀº /proc/meminfoÀÌ´Ù. ÀÌ ÆÄÀÏÀº ´ÙÀ½°ú °°Àº ¸Þ¸ð¸®ÀÇ »ó¼¼ÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.

[root@localhost proc]# cat meminfo 
        total:    used:    free:  shared: buffers:  cached:
Mem:  260984832 257720320  3264512  4489216 48381952  8617984
Swap: 542826496        0 542826496
MemTotal:       254868 kB
MemFree:          3188 kB
...
				
µ¥ÀÌÅÍ´Â scanf¸¦ ÀÌ¿ëÇÏ´Â Á¤µµ·Î ¾î·ÆÁö ¾Ê°Ô °¡Á®¿Ã ¼ö ÀÖ´Ù. °¡Á®¿Ã µ¥ÀÌŸ¸¦ Á¤¸®ÇÒ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ ¸¸µé±â·Î Çß´Ù.
typedef struct _df
{
    // ¹°¸®Àû ¸Þ¸ð¸® Å©±â ÀúÀå¿ë
    ulong real_total;
    ulong real_used;
    ulong real_buffers;
    ulong real_cached;

    // ½º¿Ò ¸Þ¸ð¸® Å©±â ÀúÀå¿ë
    ulong swap_total;
    ulong swap_used;
} df;
				


2.1.2절. CPU »ç¿ëÀ²

CPU»ç¿ë·üÀº /proc/stat¸¦ Âü°íÇÏ¸é µÈ´Ù.

[root@coco /root]# cat /proc/stat 
cpu  94964 233 9932 1662334
cpu0 94964 233 9932 1662334
page 467656 48623
swap 4365 11418
...
				
CPU»ç¿ë·ü·Î½á ºÎÆÃÈÄ Áö±Ý±îÁö ¼Ò¸ðµÈ jiffiesÀÇ Å©±â¸¦ ³ªÅ¸³½´Ù. 5°³ÀÇ Çʵå·Î ±¸¼ºµÇ¾î ÀÖÀ¸¸ç, ù¹øÂ° Çʵå´Â CPU¹øÈ£, µÎ¹øÂ° Çʵå´Â user ¸ðµå, ¼¼¹øÂ° Çʵå´Â low priority(nice»óÅÂ)ÀÇ user¸ðµå¸¦ ³ªÅ¸³½´Ù. ³×¹øÂ° Çʵå´Â system ¸ðµå ¸¶Áö¸·Àº idle Å×½ºÅ©ÀÇ jiffies ¼Ò¸ð °ªÀ» ³ªÅ¸³½´Ù. ¿ì¸®°¡ ÇÊ¿ä·Î ÇÏ´Â °ªÀº µÎ¹øÂ°, ³×¹øÂ°, ´Ù¼¸¹øÂ° ÇʵåÀÇ °ªÀ¸·Î ÀÌµé °ªÀ» ÀÌ¿ëÇØ¼­ CPUÀÇ »ç¿ëÀ²À» ¾ò¾î¿Ã ¼ö ÀÖ´Ù.

/proc/statÀÇ Ãâ·Â³»¿ëÀ» º¸¸é cpu¿Í cpu0°ú °°ÀÌ µÚ¿¡ ¼ýÀÚ°¡ ºÙÀº °Í°ú ±×·¸Áö ¾ÊÀº °ÍÀÌ Àִµ¥, ¼ýÀÚ°¡ ºÙÁö ¾ÊÀº °ÍÀº (cpu°¡ ¿©·¯ °³ ÀÖÀ» ¶§)Àüü cpu¿¡ ´ëÇÑ jiffiesÃÑÇÕÀÇ °è»êÀ» º¸¿©ÁØ´Ù. ¼ýÀÚ°¡ ºÙÀº°ÍµéÀº °³º° cpu¿¡ ´ëÇÑ jiffies°ªÀ» º¸¿©ÁØ´Ù. À§ÀÇ ¸®´ª½º½Ã½ºÅÛÀÇ °æ¿ì ´ÜÁö ÇϳªÀÇ cpu·Î ÀÌ·ç¾îÁ® ÀÖÀ½À» ÁüÀÛÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¸¸¾à CPUÀÇ IDLE»óŸ¸À» ¾Ë°í ½Í´Ù¸é ´Ù¼¸¹øÂ° Çʵ尪¸¸À» Á¶»çÇÏ¸é µÉ°ÍÀÌ´Ù.

ÀÌ·¸°Ô ÇØ¼­ CPUÀÇ jiffies¸¦ °¡Áö°í ¿À±ä ÇßÁö¸¸ À̰͸¸À¸·Î´Â ¿ì¸®°¡ ¿øÇÏ´Â Á¤º¸¸¦ ¾ò¾î¿Ã¼ø ¾ø´Ù. ½ÇÁ¦ ¿ì¸®°¡ ¿øÇÏ´Â Á¤º¸´Â Àüü CPU»ç¿ë jiffiesÁß idle jiffies¸¦ ¾ò¾î¿Í¾ß Çϰí À̰ÍÀ» ´Ù½Ã ¹éºÐÀ²·Î Ç¥½ÃÇØ¾ß ÇϹǷΠ¾à°£ÀÇ °¡°øÀ» ÇØÁÖ¾î¾ß ÇÑ´Ù.

¹æ¹ýÀº °£´ÜÇÏ´Ù. ÀÏÁ¤½Ã°£ ¼ÒºñµÈ idel jiffies¸¦ ÃÑ ¼ÒºñµÈ jiffies·Î ³ª´² ÁÖ¸é µÈ´Ù.

(idle jiffies)*100 / (idle jiffies + use jiffies + system jiffies + low prio jiffies)    
				
À§ÀÇ ¹æ¹ýÀ» ÅëÇϸé cpuÀÇ idleÀÇ ¹éºÐÀ² °ªÀ» ¾ò¾î¿Ã ¼ö ÀÖ´Ù. ÀÏÁ¤ ½Ã°£Àº ÃÊ´ÜÀ§·Î ÇÏ¸é µÇ°í, ¼ÒºñµÈ jiffies¸¦ ±¸ÇØ¾ß ÇÔÀ¸·Î ÀÌÀüÀÇ jiffies°ªÀ» °¡Áö°í ÀÖ¾î¾ß µÈ´Ù.


2.1.3절. µð½ºÅ© »ç¿ëÀ²

º¸Åë µð½ºÅ© »ç¿ëÀ²À» È®ÀÎÇϱâ À§Çؼ­ ¿©·¯ºÐÀº df½Ã½ºÅÛ ¸í·É¾î¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ´ÙÀ½Àº df·Î È®ÀÎÇØº» ÇÊÀÚÀÇ ½Ã½ºÅÛÀÇ µð½ºÅ© »ç¿ëÀ²ÀÌ´Ù.

그림 1. µð½ºÅ© »ç¿ëÀ²

µð½ºÅ©ÀÇ »ç¿ëÀ²À» °Ë»çÇϱâ À§Çؼ­´Â /etc/mtab°ú /proc/mounts, /proc/partitionÀÇ Á¤º¸¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù. /proc/mounts´Â ÇöÀç ¸¶¿îÆ®µÈ ÀåÄ¡¿Í ¸¶¿îÆÃ°æ·Î ÆÄÀϽýºÅÛ Á¾·ù Á¤º¸¸¦ ´ã°í ÀÖ´Ù.

[root@localhost proc]# mounts 
/dev/root / ext2 rw 0 0
/proc /proc proc rw 0 0
usbdevfs /proc/bus/usb usbdevfs rw 0 0
/dev/hda1 /boot ext2 rw 0 0
/dev/hda6 /home ext2 rw 0 0
/dev/hda5 /usr ext2 rw 0 0
/dev/hda8 /var ext2 rw 0 0
none /dev/pts devpts rw 0 0
automount(pid556) /misc autofs rw 0 0
				
À§ÀÇ ³»¿ëÀº /proc/mountsÀÇ ³»¿ëÀÌ´Ù. ¿ì¸®´Â ½ÇÁ¦ ÀåÄ¡¿¡ ¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛ¿¡ ´ëÇÑ Á¤º¸¸¸À» ÇÊ¿ä·Î ÇϹǷΠ/dev·Î ½ÃÀ۵Ǵ °Íµé¿¡ ´ëÇÑ Á¤º¸¸¸ ÀÐ¾î ¿À¸é µÈ´Ù. ±×·±µ¥ À§ÀÇ Á¤º¸¸¦ º¸¸é ÀåÄ¡°¡ Á» ÀÌ»óÇÏ°Ô Ç¥½ÃµÇ´Â°Ô ÀÖÀ» °ÍÀÌ´Ù. /dev/root°¡ ±×°ÍÀε¥, ±âº»ÀûÀ¸·Î /dev/root´Â Á¸ÀçÇÏÁö ¾Ê´Â ÀåÄ¡ÀÌ´Ù. ±×·³À¸·Î ¿Ã¹Ù¸¥ ÀåÄ¡¸íÀ» Àоî¿Í¾ß¸¸ Çϴµ¥ ±×·¯±â À§Çؼ­ /etc/mtabÆÄÀϰú ºñ±³Çؼ­ °°ÀÌ »ç¿ëÇÏ°Ô µÈ´Ù.
[root@localhost proc]# cat /etc/mtab  
/dev/hda7 / ext2 rw 0 0
none /proc proc rw 0 0
usbdevfs /proc/bus/usb usbdevfs rw 0 0
/dev/hda1 /boot ext2 rw 0 0
/dev/hda6 /home ext2 rw 0 0
/dev/hda5 /usr ext2 rw 0 0
/dev/hda8 /var ext2 rw 0 0
none /dev/pts devpts rw,gid=5,mode=620 0 0
automount(pid556) /misc autofs rw,fd=5,pgrp=556,minproto=2,maxproto=3 0 0
				
À§ÀÇ Á¤º¸¸¦ º¸¸é ·çÆ® ÆÄÀÏ ½Ã½ºÅÛÀÌ ¿¬°áµÈ ÀåÄ¡°¡ Á¦´ë·Î Ç¥½ÃµÇ°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÀÌÂë ÇØ¼­ ÇÑ °¡Áö Àǹ®Á¡ÀÌ »ý±æ °ÍÀÌ´Ù. ±×·¸´Ù¸é ±×³É óÀ½ºÎÅÍ /etc/mtab¸¦ ÀÌ¿ëÇØ¼­ ¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛÀÇ Á¤º¸¸¦ °¡Á®¿Ã ¼ö ÀÖÁö ¾ÊÀº°¡ ÇÏ´Â Á¡ÀÌ´Ù. ºÐ¸íÈ÷ /etc/mtab¸¸À» ÀÌ¿ëÇØµµ ¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛ¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò¾î ¿Ã ¼ö ÀÖ±â´Â ÇÏ´Ù. ±×·±µ¥ ÇѰ¡Áö ¹®Á¦Á¡ÀÌ Àִµ¥, ±×°Ç mtabÆÄÀÏÀ» °ü¸®ÇÏ´Â ÁÖü°¡ Ä¿³ÎÀÌ ¾Æ´Ï¶ó´Â Á¡ÀÌ´Ù. mount½Ã½ºÅÛ ÇÁ·Î±×·¥ÀÌ /etc/mtabÀÇ Á¤º¸¸¦ °»½ÅÇÏ°í »ç¿ëÇϴµ¥, ÀÌ´Â mount¹öÁ¯ ȤÀº ¹ö±×µî¿¡ ÀÇÇØ¼­ mtab³»¿ëÀÌ Á¦´ë·Î ¹Ý¿µµÇÁö ¾ÊÀ» ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù. ½ÇÁ¦ °¡²û ÀÌ·¯ÇÑ »óȲÀÌ ¹ß»ýÇϱ⵵ ÇÑ´Ù. ¹Ý¸é /proc/mounts´Â Ä¿³Î¿¡¼­ Á÷Á¢ °ü¸®ÇÏ°Ô µÊÀ¸·Î À§ÀÇ ¹®Á¦µéÀ» ÇÇÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ ±»ÀÌ /etc/mtab¸¸ »ç¿ëÇÏÁö ¾Ê°í /proc/mounts¿Í ÇÔ²² »ç¿ëÇÏ°Ô µÈ´Ù.

½ÇÁ¦ dfÀÇ ½î¾²Äڵ带 º¸¸é mtab¿Í /proc/mounts¸¦ °°ÀÌ ÀÌ¿ëÇØ¼­ ÆÄÀϽýºÅÛ Á¤º¸¸¦ ¾ò¾î ¿À´Â °É È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.

ÀÌ·¸°Ô /proc/mounts¿Í mtabÀ» ÀÌ¿ëÇØ¼­ Á¤È®ÇÑ ¸¶¿îÆ®µÈ ÀåÄ¡ Á¤º¸¸¦ ¾ò¾î¿Ô´Ù¸é °¢ ÀåÄ¡ÀÇ Å©±â¿Í »ç¿ë·®µîÀ» °Ë»çÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ Á¤º¸´Â statfs(2)½Ã½ºÅÛ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. »ç¿ë¹æ¹ýÀº ¿¹Á¦¸¦ ÅëÇØ¼­ ¾Ë¾Æ º¼ °ÍÀÌ´Ù.


2.1.4절. ÇÁ·Î¼¼½º Á¤º¸

ÇÁ·Î¼¼½º Á¤º¸´Â ÀÌ¹Ì ÇÁ·Î¼¼½º Á¤º¸ ¾ò¾î¿À±â¿¡¼­ ´Ù·é ¹Ù ÀÖÀ½À¸·Î Áߺ¹À» ÇÇÇÏ´Â Â÷¿ø¿¡¼­ ´Ù·çÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. À̰ÍÀº °¢ÀÚ Å×½ºÆ®Çغ¸±â ¹Ù¶õ´Ù.


3절. jsms ÀÛ¼º

¿ì¸®°¡ ¸¸µé ÇÁ·Î±×·¥Àº ±â´ÉÀÇ ±¸Çö¿¡¸¸ ½Å°æÀ» ¾µ °ÍÀÌ´Ù. ±ò²û, È¿À², °¡µ¶¼º ÀÌ·±°Ç °¢ÀÚ ÀÇ ¸òÀ¸·Î ³²°Ü ³õµµ·Ï ÇϰڴÙ.


3.1절. Source TreeÀÇ ±¸¼º

¿øÇÒÇÑ ÇÁ·ÎÁ§Æ®ÀÇ ÁøÇàÀ» À§Çؼ­ mainÇÔ¼ö¿Í ÇÔ¼ö ±¸ÇöºÎºÐÀ» ºÐ¸®½Ã۵µ·Ï ÇÒ °ÍÀÌ´Ù. mainÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â ½î¾²ÆÄÀÏÀº ÃÖ¼ÒÇÑÀÇ ±â´É¸¸À» Çϸ鼭 ´ÜÁö ÇÊ¿ä·Î ÇÏ´Â ÇÔ¼ö¸¦ È£Ãâ ÇØ¼­ È­¸é¿¡ Ãâ·ÂÇÏ´Â Àϸ¸À» Çϵµ·Ï ÇÒ°ÍÀÌ´Ù.

 ./--+-- Makefile 
     |
     +-- jsms.cc
     |
     +-- main.cc
     | 
     +-- include/ ------ jsms.h
			


3.2절. Makefile

À̰ÍÀº make·êÀ» ´ã°í ÀÖ´Â ÆÄÀÏ·Î ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÈ´Ù. °£´ÜÇÏ°Ô ÀÌÇØ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. Makefile°ü·Ã ³»¿ëÀº make¸¦ ÀÌ¿ëÇÑ ÇÁ·ÎÁ§Æ® °ü¸®¸¦ Âü°íÇϱ⠹ٶõ´Ù.

¿¹Á¦ : Makefile

#############################################################################
# Makefile for building jsms
# Generated by tmake at 15:32, 2003/06/13
#     Project: jsms
#    Template: app
#############################################################################

####### Compiler, tools and options

CC  =   gcc
CXX =   g++
CFLAGS  =   -pipe -Wall -W -O2 -DNO_DEBUG
CXXFLAGS=   -pipe -Wall -W -O2 -DNO_DEBUG

# ./includeÀÇ Çì´õÆÄÀÏÀ» ÂüÁ¶Çϵµ·Ï Çϱâ À§Çؼ­
INCPATH =   -I./include
LINK    =   g++
LFLAGS  =

TAR =   tar -cf
GZIP    =   gzip -9f

####### Files

HEADERS =   include/jsms.h
SOURCES =   jsms.cc \
        main.cc
OBJECTS =   jsms.o \
        main.o
INTERFACES =
UICDECLS =
UICIMPLS =
SRCMOC  =
OBJMOC  =
DIST    =
TARGET  =   jsms
INTERFACE_DECL_PATH = .

####### Implicit rules

.SUFFIXES: .cpp .cxx .cc .C .c

.cpp.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cxx.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cc.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.C.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.c.o:
    $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
    
####### Build rules
    

all: $(TARGET)
    
$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) 
    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
    
dist:
    $(TAR) jsms.tar jsms.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)
    $(GZIP) jsms.tar

clean:
    -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)
    -rm -f *~ core

####### Sub-libraries


###### Combined headers


####### Compile

jsms.o: jsms.cc

main.o: main.cc
			


3.3절. jsms.h

¿ª½Ã ÁÖ¼®À¸·Î ¸ðµç ¼³¸íÀ» ´ë½ÅÇϵµ·Ï ÇϰڴÙ.

¿¹Á¦ : jsms.h

#ifndef _JSMS_H_
#define _JSMS_H_
#include <vector>
#include <algorithm>
#include <unistd.h>
#include <stdio.h>
#include <set>
#include <iostream>
#include <sys/vfs.h>

#define MOUNT_STR_LEN 255
#define DEVICE_STR_LEN 80
#define MAX_CPU_NUM 32

#define DF_LINE_LEN MOUNT_STR_LEN + DEVICE_STR_LEN

using namespace std;

// µð½ºÅ© Á¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ ±¸Á¶Ã¼
typedef struct _df
{
    int blocks;       // ÇÒ´çµÈ ºí·°
    int used;         // »ç¿ëÇϰí ÀÖ´Â ºí·°
    int avail;        // »ç¿ëÇÒ ¼ö ÀÖ´Â ºí·°
    char mount[MOUNT_STR_LEN];   // ¸¶¿îÆ® µð·ºÅ丮
    char device[DEVICE_STR_LEN]; // ÀåÄ¡¸í 
} df;

// cpu »ç¿ëÀ²
// ¿©·¯°³ÀÇ CPU¸¦ »ç¿ëÇÒ ¼öµµ ÀÖÀ½À¸·Î 
// CPUÀÇ °¹¼ö¸¦ ÀúÀåÇϸç, 
// CPUÀÇ »ç¿ëÀ²Àº (CPU°¹¼ö ¸¸Å­)¹è¿­¿¡ ÀúÀåµÈ´Ù.  
typedef struct _cpu_usage
{
    int cpuid;          // Ưº°È÷ »ç¿ëµÇÁö ¾Ê´Â´Ù.
    int countcpu;       // µî·ÏµÈ CPUÀÇ ¼ö
    int cpuusage[MAX_CPU_NUM]; // °¢ CPUÀÇ »ç¿ëÀ²
} cpu_usage;


// ¸Þ¸ð¸® Á¤º¸ 
// ¹°¸®Àû ¸Þ¸ð¸®¿Í ½º¿Ò ¸Þ¸ð¸® ÀúÀå¿ë
typedef struct _mem_data
{
    ulong real;   // ¹°¸®Àû ¸Þ¸ð¸® Å©±â
    ulong free;   // ¹°¸®Àû ¸Þ¸ð¸® ³²Àº Å©±â 
    ulong swap_use;  // ½º¿Ò »ç¿ë·®
    ulong swap_free; // ½º¿Ò ³²Àº·®
} mem_data;

// ³ªÁß¿¡ /etc/mtab°ú /proc/mountsÀÇ Á¤º¸¸¦ 
// ºñ±³Çϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÑ´Ù.  
// »ç¿ë¹ýÀº jsms.cc¸¦ Âü°í
struct ltstr
{
    bool operator()(const df m1, const df m2) const
    {
        return strcmp(m1.mount, m2.mount) < 0;
    }
};


class JSms
{

    private:
        // ÇöÀç CPU»ç¿ëÀ² (jiffly °¹¼ö)
        int mcurrent_usage[MAX_CPU_NUM][3];
        // ¹Ù·ÎÀüÀÇ CPU»ç¿ëÀ²
        int mold_usage[MAX_CPU_NUM][3];

    public :
    // µð½ºÅ© Á¤º¸¸¦ ¾ò±â À§ÇÑ ¸Þ¼­µå 
    vector<df> GetDf();
    // CPU»ç¿ëÀ²À» ¾ò±â À§ÇÑ ¸Þ¼­µå
    cpu_usage GetCpuIdle();
    // ¸Þ¸ð¸® Á¤º¸¸¦ ¾ò±â À§ÇÑ ¸Þ¼­µå
    mem_data GetMem();
};

#endif
			


3.4절. jsms.cc

JSmsÀÇ Å¬·¡½ºÀÇ Á¤ÀǸ¦ ´ã°í ÀÖ´Ù. ÄÚµåµå¿Í ÇÔ²² /procÀÇ °¢ ÆÄÀÏÀ» ÇÔ²² Âü°íÇϸé Á»´õ ÀÌÇØÇϱ⠽¬¿ï °ÍÀÌ´Ù. /procÀÇ °¢ ÆÄÀÏ·Î ºÎÅÍ Á¤º¸¸¦ ¾ò¾î¿À´Â °ÍÀº scanf°è¿­ ÇÔ¼ö¸¦ »ç¿ëÇß´Ù.

¿¹Á¦ : jsms.cc

#include <jsms.h>
#include <vector>
#include <algorithm>
#include <unistd.h>
#include <stdio.h>
#include <set>
#include <iostream>
#include <sys/vfs.h>


// /etc/mtab¿Í /proc/mountsÀÇ ÆÄÀϳ»¿ëÀ» ÀÌ¿ëÇØ¼­ 
// ¸¶¿îÆ®µÈ µð½ºÅ©ÀÇ Á¤º¸¸¦ ¾ò¾î¿Â´Ù. 
vector<df> JSms::GetDf()
{
    FILE *fp = NULL;
    struct statfs lstatfs;
    unsigned int i = 0;

    set<df, ltstr> smtab, smount;
    vector<df> vmtab;

    char line[DF_LINE_LEN];

    df ldf_data;

    // ¸ÕÀú /etc/mtabÀ» ¿­¾î¼­ °¢ ÀåÄ¡¿Í 
    // ÀåÄ¡¿¡ ¸¶¿îÆ®µÈ ÆÄÀÏÀÇ À̸§À» ¾ò¾î¿Â´Ù. 
    // ¾ò¾î¿Â µ¥ÀÌÅÍ´Â smtab setÄÁÅ×À̳ʿ¡ ÀúÀåÇÑ´Ù. 
    // smtab¿¡ ÀúÀåµÈ µ¥ÀÌÅÍ´Â ³ªÁß¿¡ /proc/mounts µ¥ÀÌÅÍ¿Í 
    // ºñ±³ÇÏ°Ô µÈ´Ù. 
    // ¿Ö³ÄÇÏ¸é ¸¶¿îÆ® ÆÄÀÏ¿¡ ´ëÇÑ µð¹ÙÀ̽º À̸§ÀÌ À߸ø ÁöÁ¤µÇ¾î 
    // ÀÖÀ» ¼ö ÀÖÀ½À¸·Î À̰æ¿ì /proc/mountsÀÇ ³»¿ëÀ» ÂüÁ¶ÇØ¾ß Çϱâ 
    // ¶§¹®ÀÌ´Ù. 
    fp = fopen("/etc/mtab", "r");
    if (fp == NULL)
    {
        cout << "Open Error mtab" << endl;
        exit(0);
    }

    while(fgets(line, DF_LINE_LEN, fp) != NULL)
    {
        if ((strstr(line, "/dev/") - line) == 0)
        {
            sscanf(line, "%s %s", ldf_data.device, ldf_data.mount);
            smtab.insert(ldf_data);
        }
    }
    fclose(fp);
    fp = NULL;

    // /proc/mounts·Î ºÎÅÍ µð¹ÙÀ̽º¿Í ¸¶¿îÆ®ÆÄÀÏ Á¤º¸¸¦ 
    // ¾ò¾î¿Â´Ù.  
    fp = fopen("/proc/mounts", "r");
    if (fp == NULL)
    {
        cout << "Open Error mounts" << endl;
        exit(0);
    }
    while(fgets(line, DF_LINE_LEN, fp) != NULL)
    {
        if ((strstr(line, "/dev/") - line) == 0)
        {
            sscanf(line, "%s %s", ldf_data.device, ldf_data.mount);
            smount.insert(ldf_data);
        }
    }
    fclose(fp);
    fp = NULL; 

    // /proc/mount¿Í /etc/mtabÀÇ ³»¿ëÀ» intersection(±³ÁýÇÕ)¿¬»êÀ» ½ÃŲ´Ù. 
    // ¿¬»ê¿¡ »ç¿ëÇÒ ºñ±³ÇÔ¼ö´Â jsms.h¿¡ Á¤ÀÇ µÇ¾îÀÖ´Â ltstrÀÌ´Ù.  
    // ±³ÁýÇÕ¿¡ »ç¿ëµÉ ºñ±³ µ¥ÀÌÅÍ´Â ¸¶¿îÆ® µð·ºÅ丮 À̸§ÀÌ´Ù. 
    // ÀÌ·¸°Ô ÇÒ°æ¿ì ºñ·Ï /etc/mtab¿¡ ÀÖ´Â ÀåÄ¡À̸§ÀÌ À߸øµÇ¾ú´Ù°í ÇÏ´õ¶óµµ 
    // /proc/mountÀÇ Á¦´ë·ÎµÈ ÀåÄ¡À̸§À¸·Î µ¤¾î ¾µ ¼ö ÀÖ´Ù.  
    // ÀÌ µ¥ÀÌÅÍ´Â vmtab¿¡ ÀúÀåµÈ´Ù. 
    set_intersection( smtab.begin(), smtab.end(),
               smount.begin(), smount.end(),
               back_inserter(vmtab), ltstr());
    
    // ¸¶¿îÆ®µÈ ÆÄÀϽýºÅÛ¿¡ ´ëÇÑ µð½ºÅ© »ç¿ëÀ²À» ±¸ÇÑ´Ù. 
    {
        for (i = 0; i < vmtab.size(); i++)
        { 
            statfs(vmtab[i].mount, &lstatfs);
            vmtab[i].blocks = lstatfs.f_blocks*(lstatfs.f_bsize/1024);
            vmtab[i].avail  = lstatfs.f_bavail*(lstatfs.f_bsize/1024);
            vmtab[i].used   = vmtab[i].blocks - vmtab[i].avail;
        }
    }
    return vmtab;
}

// CPU»ç¿ëÀ²À» üũÇÑ´Ù. 
// CPU»ç¿ëÀ²À» À§Çؼ­´Â ÇöÀçÀÇ jiffies°ªÀ» ±¸Çϰí 
// °ú°ÅÀÇ jiffiesÀÇ °ª°ú ºñ±³Çؼ­ ¾ó¸¶¸¸Å­ Áõ°¡ Çß´ÂÁö¸¦ 
// ÆÇ´ÜÇØ¼­ ¹éºÐÀ²·Î ³ªÅ¸³»°Ô µÈ´Ù.
// ±×·¯¹Ç·Î ÀÌ ¸Þ¼­µå´Â µÎ¹ø È£ÃâÇØ¾ß ÇÑ´Ù. 
// óÀ½ È£Ãâ·Î ¾Ë¾Æ³½ jiffies°ªÀº º°µµÀÇ º¯¼ö¿¡ ÀúÀåµÇ°í 
// sleep¸¦ È£ÃâÇÑ ÈÄ Àá½ÃÈÄ ´Ù½Ã ÀÌ ¸Þ¼­µå¸¦ È£ÃâÇØ¾ß ÇöÀçÀÇ 
// jiffies°ª°ú °ú°ÅÀÇ jiffies¸¦ ÀÌ¿ëÇÑ °è»êÀÌ °¡´ÉÇØ Áø´Ù. 
cpu_usage JSms::GetCpuIdle()
{
    FILE *fp = NULL;
    char line[80];
    cpu_usage lcpu_usage;
    char cpuid[32];
    int nulldata;
    int totaldiff;
    int diff[3];
    int cpu_num = 0;

    memset((void *)&lcpu_usage, 0x00, sizeof(cpu_usage));

    // /proc/statÆÄÀÏÀ» Àо jiffies°ªÀ» °è»êÇÑ´Ù. 
    fp = fopen("/proc/stat", "r");
    if(fp == NULL)
    {
        cout << "Cannot open stat" << endl;
        return lcpu_usage;
    }
    while(1)
    {
        fgets(line,80, fp);
        if (strstr(line, "cpu") == NULL)
        {
            fclose(fp);
            // cpu °¹¼ö¸¦ ¼¼ÆÃÇÏ°í ¸®ÅÏÇÑ´Ù. 
            lcpu_usage.countcpu = cpu_num -1;
            return lcpu_usage;
        }
        else
        {
            // /proc/stat¿¡¼­ ÃÖÃÊ¿¡ ÀÐ¾î µéÀÌ´Â µ¥ÀÌÅÍ´Â 
            // Àüü CPU¿¡ ´ëÇÑ Åë°è µ¥ÀÌÅÍ´Ù. 
            // ±×·¯¹Ç·Î °³º° CPU¿¡ ´ëÇÑ µ¥ÀÌÅ͸¦ ¾ò±â À§Çؼ­´Â óÀ½ ¶óÀÎÀº 
            // ¹«½ÃÇÏ°í ³Ñ¾î°¡¾ß ÇÑ´Ù. 
            if (cpu_num > 0)
            {
                // sscanf¸¦ ÀÌ¿ëÇØ¼­ jiffies°ªÀ» ¾ò¾î¿Â´Ù. 
                // ±×¸®°í °ú°ÅÀÇ jiffies°ª°úÀÇ ¿¬»êÀ» ÅëÇØ¼­ 
                // °¢°¢ÀÇ jiffies°¡ ¾ó¸¶¸¸Å­ º¯Çß´ÂÁö¸¦ È®ÀÎÇϰí 
                // ÀÌ °ªÀ» ¹éºÐÀ²·Î ³ªÅ¸³½´Ù. 
                sscanf(line, "%s %d %d %d %d",
                               cpuid,
                               &mcurrent_usage[cpu_num-1][0],
                               &nulldata,
                               &mcurrent_usage[cpu_num-1][1],
                               &mcurrent_usage[cpu_num-1][2]);
                diff[0] = mcurrent_usage[cpu_num-1][0] - mold_usage[cpu_num-1][0];
                diff[1] = mcurrent_usage[cpu_num-1][1] - mold_usage[cpu_num-1][1];
                diff[2] = mcurrent_usage[cpu_num-1][2] - mold_usage[cpu_num-1][2];

                totaldiff = diff[0] + diff[1] + diff[2];
                lcpu_usage.cpuusage[cpu_num-1] = (diff[2]*100)/totaldiff;

                memcpy((void *)&mold_usage,
                                (void *)&mcurrent_usage,
                                sizeof(mcurrent_usage));
            }
            cpu_num ++;
        }
    }
    if(fp != NULL)
        fclose(fp);
}

// ¸Þ¸ð¸® Á¤º¸¸¦ ¾ò¾î¿Â´Ù.
mem_data JSms::GetMem()
{
    FILE *fp = NULL;
    int index = 0;
    char line[128];
    mem_data lmem_data;
    int nulldata;
    char null[12];

    fp = fopen("/proc/meminfo", "r");
    if (fp == NULL)
    {
        cout << "Meminfo open error" << endl;
        exit(0);
    }
    
    while(1)
    {
        fgets(line, 128, fp);
        if(index == 0)
        {
            index ++;
            continue;
        }
        else if(index == 1)
        {
            sscanf(line, "%s %lu %d %lu", null, &lmem_data.real, &nulldata, &lmem_data.free
);  
        }
        else if(index == 2)
        {
            sscanf(line, "%s %lu %lu %lu", null, &nulldata, &lmem_data.swap_use,
                                        &lmem_data.swap_free);
        }
        else
        {
            fclose(fp);
            return lmem_data;
        }
        index ++;
    }
}
			


3.5절. main.cc

mainÇÔ¼ö´Â ´ÜÁö JSmsŬ·¡½º¸¦ ÀÌ¿ëÇÏ´Â °Í ¸»°í´Â ÇÏ´Â ÀÏÀÌ ¾ø´Ù. ÇÁ·Î±×·¥ ½ÇÇàÀÎÀÚ¸¦ ó¸®Çϱâ À§Çؼ­ getopt()¸¦ »ç¿ëÇß´Ù.

¿¹Á¦ : main.cc

#include <jsms.h>
#include <unistd.h>

void help()
{
    printf("Usage : jsms -[mcf] \n"
           "-m    : mem info\n"
           "-c    : cpu usage\n"
           "-h    : help message\n"
           "-f    : disk info\n");
    exit(0);
}

int main(int argc, char **argv )
{
    class JSms lSms;
    vector<df> ldf;
    mem_data lmem_data;
    int opt;


    while((opt = getopt(argc, argv, "mcfh")) != -1)
    {
        // ¸Þ¸ð¸® Á¤º¸¸¦ ¿äûÇßÀ»¶§
        switch (opt)
        {
            case 'm':
            {
                ulong swap_real;
                lmem_data = lSms.GetMem();
                printf("REAL : %15lu %15lu %lu\n", lmem_data.real,
                    lmem_data.free,
                    ((lmem_data.real - lmem_data.free)*100)/lmem_data.real);
                swap_real = lmem_data.swap_use + lmem_data.swap_free;
                printf("Swap : %15lu %15lu %lu\n", swap_real,lmem_data.swap_free,
                        (swap_real - lmem_data.swap_free)*100/swap_real);
                break;
            }
            // CPU»ç¿ëÀ²À» ¿äûÇßÀ»¶§
            // sleep()À» ÀÌ¿ëÇØ¼­ ½Ã°£Â÷¸¦ µÎ°í GetCpuIdle¸¦ µÎ¹ø È£ÃâÇßÀ½¿¡ 
            // À¯ÀÇ ÇÑ´Ù.  
            case 'c':
            {
                cpu_usage lcpu_usage;
                lcpu_usage = lSms.GetCpuIdle();
                sleep(1);
                lcpu_usage = lSms.GetCpuIdle();
                for (int i = 0; i < lcpu_usage.countcpu; i++)
                {
                    printf("[%d] : %d\n", i+1, lcpu_usage.cpuusage[i]);
                }
                break;
            }
            // µð½ºÅ© »ç¿ë·® üũ 
            case 'f':
            {
                ldf = lSms.GetDf();
                for (int i = 0; i < ldf.size(); i++)
                {
                    printf("%10s %-15s %12d %12d\n", ldf[i].device,
                                         ldf[i].mount,
                                         ldf[i].blocks,
                                         ldf[i].used);
                }
                break;
            }
            // µµ¿ò¸»
            case 'h':
            {
                help();
                break;
            }
            default :
            {
                help();
                break;
            }
        }
    }
}
			

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