|
|
°Ô½Ã¹° 9°Ç
|
|
|
³ª¸¸ÀÇ ps¸¦ ¸¸µé¾îº¸ÀÚ |
|
±Û¾´ÀÌ :
ÃÖ°í°ü¸®ÀÚ
³¯Â¥ : 2009-12-01 (È) 10:42
Á¶È¸ : 242174
|
|
±ÛÁÖ¼Ò :
|
±³Á¤ °úÁ¤ |
±³Á¤ 0.8 |
2003³â 4¿ù 7ÀÏ 23½Ã |
|
ÃÖÃÊ ¹®¼ÀÛ¼º |
´ëºÎºÐÀÇ Unix¿î¿µÃ¼Á¦´Â procÆÄÀϽÃÅÛÀ» Á¦°øÇÑ´Ù. proc´Â process infomation pseudoÀÇ ÁÙÀÓ¸»ÀÌ´Ù. Áï procÆÄÀϽýºÅÛÀº Ä¿³Î¿¡¼Á¦°øÇÏ´Â ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ÀúÀåÇÏ°í ÀÖ´Â ÆÄÀϽýºÅÛÀ̶ó°í Á¤¸®ÇÒ¼ö ÀÖ´Ù.
ÀÌ ¹®¼´Â procÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇؼ ½ÇÁ¦ ÇÁ·Î¼¼½º¸ñ·ÏÀ» Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥Á¦ÀÛ°ú °ü·ÃµÈ ³»¿ëÀ» ´ã°í ÀÖ´Ù. ¹®¼´Â ¸®´ª½º¿î¿µÃ¼Á¦(kernel 2.4.x)¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù.
¸®´ª½º Ä¿³ÎÀÇ ÁÖµÈÀÓ¹«Áß Çϳª´Â ÇÁ·Î¼¼½º¸¦ ½ÇÇà½ÃÅ°°í À̵éÀ» À¯ÁöÇÏ´Â ÀÏÀ̸ç, À̸¦ À§Çؼ Ä¿³Îµ¥ÀÌŸ±¸Á¶Ã¼¸¦ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ°Ô µÈ´Ù. ±×·±µ¥ ÀÌ·± ÇÁ·Î¼¼½ºÁ¤º¸´Â Ä¿³Î¿¡°Ô¸¸ ÇÊ¿äÇÑ°Ô ¾Æ´Ï°í ½Ã½ºÅÛ °ü¸®ÀÚȤÀº ÇÁ·Î±×·¡¸Óµé¿¡°Ôµµ Àý´ëÀûÀ¸·Î ÇÊ¿äÇÑ Á¤º¸ÀÌ´Ù.
±×·¸´Ù¸é ÇÊ¿äÇÑ Á¤º¸¸¦ ¾ò¾î³»±â À§Çؼ ¾î¶»°Ô ÇؾßÇÒ±î? Á÷Á¢ Ä¿³Î¿¡°Ô Ä¿³Îµ¥ÀÌŸ±¸Á¶Ã¼¸¦ ¿äûÇؼ ±×°É ÀÏÀÏÀÌ ºÐ¼®ÇØ¾ß ÇÒ±î ? ¹°·Ð ±×·¸°Ôµµ ÇÒ¼ö ÀÖ°ÚÁö¸¸, ÀÌ°ÍÀº ¸Å¿ì º¹ÀâÇÑ ÀÛ¾÷À̸ç, ¶ÇÇÑ (Ä¿³Î¸ðµå¿¡¼ Á÷Á¢ÀÌ·ç¾îÁö´Â ÀÛ¾÷ÀÓÀ¸·Î)À§ÇèÇÑÀÛ¾÷À̱⵵ ÇÏ´Ù. ±×·¡¼ ¸®´ª½º½Ã½ºÅÛÀº »ç¿ëÀÚ·¹º§¿¡¼ ÇÁ·Î¼¼½ºÀÇ »óŸ¦ °£´ÜÇÏ°Ô È®Àΰ¡´ÉÇϵµ·Ï ÇϱâÀ§Çؼ procÆÄÀϽýºÅÛÀ» Á¦°øÇÑ´Ù.
¿ì¸®´Â º¹ÀâÇÏ°Ô Ä¿³Î·ÎºÎÅÍ ¿©·¯°¡Áö Ä¿³Îµ¥ÀÌŸ±¸Á¶Ã¼¸¦ ¿äûÇÒÇÊ¿ä ¾øÀÌ procÆÄÀϽýºÅÛ¿¡¼ Á¦°øÇÏ´Â Á¤º¸µéÀ» ÀоîµéÀÌ´Â Á¤µµ·Î °£´ÜÇÏ°Ô ÇÁ·Î¼¼½º »óŸ¦ ¾ò¾î¿Ã¼ö ÀÖ´Ù.
ÀÛÀº Á¤º¸: procÆÄÀϽýºÅÛÀº ´ëºÎºÐÀÇ À¯´Ð½º¿î¿µÃ¼Á¦¿¡¼ äÅõǾîÁö°í ÀÖÁö¸¸, µ¥ÀÌŸ¸¦ ÀúÀåÇÏ´Â ¹üÀ§¿Í Æ÷¸Ë¿¡ ÀÖ¾î¼ ¿î¿µÃ¼Á¦°£ Â÷ÀÌÁ¡À» º¸ÀδÙ. ÀúÀåÇÏ´Â ¹üÀ§ÀÇ °æ¿ì ´ëºÎºÐÀÇ À¯´Ð½º¿î¿µÃ¼Á¦´Â ´ÜÁö ÇÁ·Î¼¼½º Á¤º¸¸¸À» Á¦°øÇÏ´Â ¹Ý¸é, ¸®´ª½º´Â ÇÁ·Î¼¼½º Á¤º¸»Ó¸¸ ¾Æ´Ï¶ó ³×Æ®¿÷Á¤º¸, ÆÄÀϽýºÅÛ, µð¹ÙÀ̽º Á¤º¸, ¸Þ¸ð¸®Á¤º¸, CPUÁ¤º¸µî ´Ù¾çÇÑ Á¤º¸µéÀ» Á¦°øÇÑ´Ù.
ƯÈ÷ ¸®´ª½ºÀÇ °æ¿ì ¸î¸îÁ¤º¸µé¿¡ ´ëÇؼ´Â ´ÜÁö ¿¶÷¸¸ °¡´ÉÇÑ ¼öÁØÀÌ ¾Æ´Ñ Á÷Á¢¼öÁ¤À» ÅëÇؼ Ä¿³ÎÀÇ ÇൿÀ» º¯°æ½ÃÄÑÁÙ¼öµµ ÀÖ´Ù. ÀÌ°ÍÀº ´Ù¸¥ À¯´Ð½º¿¡ ºñÇؼ ¸Å¿ì È®ÀåµÈ ºÎºÐÀ̶ó°í ÇÒ¼ö ÀÖ´Ù.
¿¹¸¦ µé¾î ICMP¿äû¿¡ ´ëÇÑ ÀÀ´äÀ» ¸·°í ½Í´Ù¸é "echo 0 /proc/sys/net/ipv4/icmp_echo_ignore_all"ÇÏ´Â Á¤µµ·Î °£´ÜÇÏ°Ô Ä¿³ÎÀÇ ÇൿÀ» º¯°æ½ÃÄÑÁÙ¼ö ÀÖ´Ù. ´Ù¸¥¿î¿µÃ¼Á¦¿¡¼ÀÇ ÀÌ·¯ÇÑ ÀÛ¾÷Àº Àü¿ë°ü¸®µµ±¸¸¦ »ç¿ëÇϵçÁö ¸®º×ÆÃÀ» ½ÃÅ°µçÁö ÇؾßÇÑ´Ù.
ÀúÀåµÇ´Â Æ÷¸ËÀ» º¸ÀÚ¸é ¸®´ª½º´Â ÀÏ¹Ý ASCII¹®ÀÚ·Î ÀÌ·ç¾îÁø ¹Ý¸é ´Ù¸¥ À¯´Ð½ºµéÀº ±¸Á¶Ã¼·Î Á¤º¸°¡ ÀÌ·ç¾îÁ® ÀÖ´Ù. ¸®´ª½ºÀÇ °æ¿ì ÇÁ·Î¼¼½º Á¤º¸°¡ ÀϹݹ®ÀÚ·Î ÀÌ·ç¾îÁ® ÀÖ¾î¼ Á÷°üÀûÀ¸·Î È®ÀÎÇϱ⿡ ÁÁ±â´Â ÇÏÁö¸¸ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ°æ¿ì À̸¦ ÆĽÌÇؾߵDZ⠶§¹®¿¡ ´Ù¸¥ À¯´Ð½ºµé¿¡ ºñÇؼ Á» ºÒÆíÇÑÁ¡ÀÌ µÇ±âµµ ÇÑ´Ù.
¸®´ª½ºÀÇ °æ¿ì ±â´ÉÀÌ È®ÀåµÇ±ä ÇßÁö¸¸ procÆÄÀϽýºÅÛÀÇ °¡ÀåÅ« »ç¿ë¸ñÀûÀº ¹¹´Ï¹¹´Ï Çصµ ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ¾ò¾î¿À´Â ÀÏÀÌ´Ù.
±âº»ÀûÀ¸·Î procÆÄÀϽýºÅÛÀº /procµð·ºÅ丮¾È¿¡¼ ÀÌ·ç¾îÁö¸ç, ÇÁ·Î¼¼½ºÁ¤º¸´Â /procµð·ºÅ丮¹Ø¿¡ °¢ ÇÁ·Î¼¼½ºÀÇ PID¸¦ À̸§À¸·ÎÇÏ´Â ¼ºêµð·ºÅ丮 ¹Ø¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. ¿¹¸¦µé¾î PID°¡ 912ÀÎ ÇÁ·Î¼¼½º¶ó¸é, 912 ÇÁ·Î¼¼½ºÀÇ Á¤º¸´Â /proc/912(ÀÌÇÏ /proc/[PID])¹Ø¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù.
/proc/[PID] µð·ºÅ丮¹Ø¿¡´Â ´Ù½Ã ¸î°³ÀÇ µð·ºÅ丮¿Í ¸î°³ÀÇ ÆÄÀϵé·Î ÀÌ·ç¾îÁ® ÀÖ´Ù.
/proc/[PID]/ -+-- cmdline
|
+-- cwd
|
+-- environ
|
+-- exe
|
+-- fd -------+-- 0
| |
+-- maps +-- 1
|
+-- root
|
+-- stat
|
+-- statm
|
+-- status
| ¸®´ª½ºÀÇ °æ¿ì À§¿Í °°Àº ÆÄÀϵé·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. °¢ ÆÄÀÏÀÌ °¡Áö°í ÀÖ´Â ÀÚ¼¼ÇÑ Á¤º¸µé¿¡ ´ëÇؼ´Â procÀÇ manÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.
¸®´ª½ºÀÇ °æ¿ì °¢°¢ÀÇ Á¤º¸µéÀº ÀÏ¹Ý ASCIIÅؽºÆ®¹®ÀÚ·Î ÀÌ·ç¾îÁ®ÀÖ°í, ´ëºÎºÐÀÇ °æ¿ì °ø¹é¹®ÀÚ(' ')·Î ÇʵåÀÇ ±¸ºÐÀÌ µÇ¾îÀÖÀ½À¸·Î, ½±°Ô ¿øÇÏ´Â Á¤º¸µéÀ» ¾ò¾î¿Ã¼ö ÀÖ´Ù.
ÇÁ·Î¼¼½ºÁ¤º¸¸¦ È®ÀÎÇϱâ À§Çؼ ¸®´ª½º´Â ps¶ó´Â µµ±¸¸¦ Á¦°øÇÑ´Ù. ps¸¦ »ç¿ëÇÔÀ¸·Î½á, ¿ì¸®´Â ÇÁ·Î¼¼½ºÀÇ °¢Á¾Áß¿äÇÑ Á¤º¸µéÀ» ¾ò¾î¿À°í, ¾ò¾î¿Â Á¤º¸´Â ½Ã½ºÅÛ°ü¸®¿Í ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Áß¿äÇÑ µ¥ÀÌŸ·Î »ç¿ëÇÑ´Ù.
¿ì¸®°¡ ¾ò°íÀÚÇÏ´Â ÇÁ·Î¼¼½ºµ¥ÀÌŸ´Â ´ÙÀ½°ú °°´Ù.
ps¿¡ ºñÇؼ ¸î°¡Áö ºüÁø°ÍµéÀÌ ÀÖ±äÇÏÁö¸¸ ÇÁ·Î¼¼½º¸¦ °ü¸®Çϴµ¥ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ Á¤º¸´Â °¡Á®¿Â´Ù.
ÀÌ psµµ ±âº»ÀûÀ¸·Î procÆÄÀϽýºÅÛ¿¡ÀÖ´Â ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ÀÌ¿ëÇؼ °¡Á®¿Â´Ù. ´õ Á¤È®È÷ ¸»ÇÏÀÚ¸é stats¿¡¼ ÇÊ¿äÇÑ Á¤º¸¸¦ °¡Á®¿Â´Ù. ´ÙÀ½Àº ½ÇÁ¦ statsÀÇ ÆÄÀϳ»¿ëÀÌ´Ù. ¿ø·¡´Â ÇϳªÀÇ ÇàÀ¸·Î µÇ¾îÀÖÀ¸³ª Ãâ·ÂÇϱ⠽±°Ô ¿©·¯°³ÀÇ ÇàÀ¸·Î ºÐ¸®Çß´Ù.
[root@localhost 2489]# cat stat
2489 (vi) T 2251 2489 2251 772 2581 0 187 0 455 0 12 4 0 0 9 0 0 0 181334
6950912 0 4294967295 134512640 136413760 3221223720 3221222316
1074893473 0 0 12288 1333808895 3222310480 0 0 17 0
| ¿ì¸®°¡ ¸¸µé°íÀÚÇÏ´Â ÇÁ·Î±×·¥Àº À§ÀÇ stat Á¤º¸¸¦ ºÐ¼®ÇÏ°Ô µÉ°ÍÀÌ´Ù.
ÇÁ·Î±×·¥ÀÇ À̸§Àº qps·Î Çϵµ·Ï ÇÏ°Ú´Ù.
ÀÌÇÁ·Î±×·¥ÀÇ ½î¾²´Â ¸î°³ÀÇ ¸ðµâ·Î ÀÌ·ç¾îÁ® ÀÖÀ¸¸ç, ½î¾²°ü¸®¸¦ À§Çؼ MakefileÀ» »ç¿ëÇÒ°ÍÀÌ´Ù. ´ÙÀ½Àº ¸¸µé°íÀÚ ÇÏ´Â qpsÀÇ ½î¾²Æ®¸® ±¸Á¶ÀÌ´Ù.
-+-- Makefile
|
+-- main.cc
|
+-- proc.cc
|
+-- qps.cc
|
+-- include ----+-- proc.h
|
+-- qps.h
| ´ÙÀ½Àº °¢ ÆÄÀϵ鿡 ´ëÇÑ ¼³¸íÀÌ´Ù.
Ç¥ 1. qps ½î¾²ÆÄÀÏ ¼³¸í
Makefile |
make¿¡¼ »ç¿ëÇÒ make rule ÆÄÀÏ |
main.cc |
mainÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â ÄÚµå, ÃÖ¼ÒÇÑÀÇ Äڵ常À» °¡Áø´Ù |
proc.cc |
½ÇÁ¦ procÆÄÀϽýºÅÛÀ» ÂüÁ¶Çؼ °¢Á¾ ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ¾ò¾î¿Â´Ù. |
qps.cc |
proc.cc¿¡ Á¤ÀÇµÈ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ¾ò¾î¿À°í À̸¦ ȸ鿡 º¸±âÁÁ°Ô Ãâ·ÂÇÑ´Ù. |
include/proc.h |
proc.cc¿¡¼ »ç¿ëµÉ ÇÔ¼ö¼±¾ð |
include/qps.h |
qps.cc¿¡¼ »ç¿ëµÉ ÇÔ¼ö¼±¾ð |
½î¾²ÄÚµåµéÀ» °ü¸®Çϱâ À§ÇÑ MakefileÀÌ´Ù. ÀÌÇØÇϴµ¥ º°´Ù¸¥ ¾î·Á¿òÀº ¾øÀ»°ÍÀÌ´Ù.
#############################################################################
# Makefile for building qps
# Generated by tmake at 23:10, 2003/04/08
# Project: qps
# Template: app
#############################################################################
####### Compiler, tools and options
CC = gcc
CXX = g++
CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG
CXXFLAGS= -pipe -Wall -W -O2 -DNO_DEBUG
INCPATH = -I./include
LINK = g++
LFLAGS =
TAR = tar -cf
GZIP = gzip -9f
####### Files
HEADERS = include/proc.h \
include/qps.h
SOURCES = main.cc \
proc.cc \
qps.cc
OBJECTS = main.o \
proc.o \
qps.o
TARGET = qps
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) qps.tar qps.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)
$(GZIP) qps.tar
clean:
-rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)
-rm -f *~ core
####### Compile
main.o: main.cc
proc.o: proc.cc
qps.o: qps.cc
|
½ÇÁúÀûÀ¸·Î stat¸¦ ºÐ¼®Çؼ ÇÁ·Î¼¼½ºµ¥ÀÌŸ¸¦ ¾ò¾î¿À´Â ÇÔ¼öµéÀ» Æ÷ÇÔÇÑ´Ù. opendir(2)ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ /proc µð·ºÅ丮¹Ø¿¡ ÀÖ´Â ÆÄÀϵéÀÇ ¸ñ·ÏÀ» ¾ò¾î¿À°í, ¸¸¾à ¾ò¾î¿Â ÆÄÀÏÀÌ µð·ºÅ丮ÀÌ¸é¼ ¼ýÀڷεǾîÀÖÀ»°æ¿ì ÇÁ·Î¼¼½ºÁ¤º¸ µð·ºÅ丮¶ó°í ÆÇ´ÜÇÏ°í, ¼ºêµð·ºÅ丮¿¡ ÀÖ´Â stat ÆÄÀÏÀ» ÀоîµéÀδÙ.
ÀоîµéÀÎ statÁ¤º¸´Â " "¸¦ ±âÁØÀ¸·Î ÆĽÌÇؼ ¹è¿(vector)¿¡ Áý¾î³Ö´Â´Ù. ´õºÒ¾î ¿ì¸®°¡ ¸¸µé°íÀÚÇÏ´Â qpsÇÁ·Î±×·¥Àº ÇØ´çÇÁ·Î¼¼½ºÀÇ À¯ÀúÀ̸§µµ °¡Á®¿Í¾ß ÇÑ´Ù. /proc/[PID]/stat ÆÄÀÏÀº ÇÁ·Î¼¼½º¼ÒÀ¯ÀÚÀÇ ±ÇÇÑÀ¸·Î ¸¸µé¾îÁø´Ù. ¿ì¸®´Â stat(2)°è¿ÇÔ¼ö¸¦ »ç¿ëÇϸé ÇØ´ç ÆÄÀÏÀÇ UID¸¦ ¾ò¾î¿Ã¼ö ÀÖ´Ù´Â°É ¾Ë¼öÀÖ´Ù. ¶ÇÇÑ getpwuid(3)¸¦ ÀÌ¿ëÇϸé ÇØ´ç UID¿¡ ´ëÇÑ À¯ÀúÀ̸§µµ ¾ò¾î¿Ã¼ö ÀÖ´Ù.
ÀÌ·¸°Ô Çؼ ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡ ´ëÇÑÁ¤º¸°¡ ¸¸µé¾îÁ³´Ù. ±×·±µ¥ ¿ì¸®´Â ÇÁ·Î¼¼½ºÀÇ ¸ñ·ÏÀ» °¡Á®¿Í¾ß ÇÔÀ¸·Î À̵é Á¤º¸´Â ´Ù½Ã ¹è¿ÀÇ ¿ø¼Ò·Î µé¾î°¡¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀڷᱸÁ¶(¹è¿ÀÇ ¹è¿)¸¦ À§Çؼ ÇÊÀÚ´Â (¼ÓÆíÇÏ°Ô)vector¸¦ »ç¿ëÇß´Ù.
´ÙÀ½Àº ½ÇÁ¦ ÄÚµåµéÀÌ´Ù. À§ÀÇ ³»¿ëµéÀº Äڵ带 ÅëÇؼ ÀÌÇØÇϱ⠹ٶõ´Ù. ±×¸®¾î·Á¿î ÄÚµåµéÀº ¾Æ´ÔÀ¸·Î ÁÖ¼®¸¸À¸·Îµµ ÃæºÐÈ÷ ÀÌÇØ°¡´ÉÇÒ°ÍÀÌ´Ù.
¿¹Á¦ : include/proc.h
#ifndef _PROC_H_
#define _PROC_H_
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <vector>
#include <dirent.h>
#include <string>
using namespace std;
// ÇÁ·Î¼¼½º µ¥ÀÌŸ ÀúÀå
typedef struct _process_info
{
char username[32]; // À¯ÀúÀ̸§
vector<string> process; // statÁ¤º¸µéÀÌ µé¾î°£´Ù
} process_info;
// ÇÁ·Î¼¼½ºÀÇ ¸®½ºÆ®¸¦ À¯ÁöÇϱâ À§ÇÑ ÀڷᱸÁ¶
// °á±¹Àº ¹è¿ÀÇ ¹è¿ÀÌ´Ù.
typedef vector<process_info> Plist;
class Proc
{
private:
int Processnum; // ÇöÀç ÇÁ·Î¼¼½º °¹¼ö
Plist ProcList; // ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®
public:
// »ý¼ºÀÚ¹× ¼Ò¸êÀÚ
Proc();
~Proc();
void MakeProcInfo(); // ÇÁ·Î¼¼½º Á¤º¸¸¦ ¾ò¾î¿Â´Ù.
vector<string> ProcParser(char *); // statÆÄÀÏÀ» ÆĽÌÇÑ´Ù
int ProcNum(); // ÇöÀçÇÁ·Î¼¼½º °¹¼ö¸¦ ³Ñ°ÜÁØ´Ù.
int IsDigit(char *); // ¹®ÀÚ¿ÀÌ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù.
Plist GetProcList(); // ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®¸¦ µÇµ¹·ÁÁØ´Ù.
};
#endif
|
¿¹Á¦ : proc.cc
#include "proc.h"
#include <iostream>
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>
Proc::Proc()
{
}
Proc::~Proc()
{
}
/*
* ÇÁ·Î¼¼½º Á¤º¸¸¦ °¡Á®¿Â´Ù.
* ±×·¯±â À§Çؼ /proc/[PID]/statÆÄÀÏÀ» ÀоîµéÀÌ°í À̸¦
* Çʵ庰·Î ÆĽÌÇÑ´Ù. ÆĽÌÀº " "¹®ÀÚ¸¦ ±âÁØÀ¸·Î ÇÑ´Ù.
* ¶ÇÇÑ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ À¯Àú À̸§µµ ¾ò¾î¿Â´Ù.
*/
void Proc::MakeProcInfo()
{
DIR *directory;
struct dirent *entry = NULL;
char proc_file[40];
vector<string> procinfo;
process_info lprocess_info;
struct stat lstat;
ProcList.clear();
// proc µð·ºÅ丮¸¦ ¿¾î¼ ÆÄÀÏ(µð·ºÅ丮Æ÷ÇÔ)ÀÇ ¸®½ºÆ®¸¦
// ¾ò¾î¿Â´Ù.
if ((directory = opendir("/proc")) == NULL)
{
perror("opendir error :");
exit(0);
}
while((entry = readdir(directory)) != NULL)
{
if (strcmp(entry->d_name, ".") !=0 &&
strcmp(entry->d_name, "..") != 0)
{
sprintf(proc_file,"/proc/%s/stat", entry->d_name);
// stat ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÏ°í È®ÀÎÇÏ°í
if (access(proc_file, F_OK) != 0)
{
continue;
}
// µð·ºÅ丮 À̸§ÀÌ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù.
// µð·ºÅ丮 À̸§ÀÌ ¼ýÀÚ¶ó¸é À̸¦ ÆĽÌÇÑ´Ù.
// ¶ÇÇÑ statÆÄÀÏÀÇ ¼ÒÀ¯ UID¸¦ ÀÌ¿ëÇؼ À¯ÀúÀ̸§µµ ¾ò¾î¿Â´Ù.
if (IsDigit(entry->d_name))
{
struct passwd *upasswd;
stat(proc_file,&lstat);
lprocess_info.process = ProcParser(proc_file);
upasswd = getpwuid(lstat.st_uid);
strncpy(lprocess_info.username, upasswd->pw_name, 32);
if(atoi(lprocess_info.process[0].c_str()) == atoi(entry->d_name))
{
ProcList.push_back(lprocess_info);
}
}
else
{
}
}
}
}
/*
* MakeProcInfo¸¦ ÅëÇظ¸µé¾îÁø ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®¸¦ µÇµ¹·ÁÁØ´Ù.
*/
Plist Proc::GetProcList()
{
return ProcList;
}
/*
* ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ µÇµ¹·ÁÁØ´Ù.
* °¹¼ö´Â ÇÁ·Î¼¼½ºÀڷᱸÁ¶(vector)ÀÇ ¿ø¼ÒÀÇ Å©±â°¡ µÈ´Ù.
*/
int Proc::ProcNum()
{
return ProcList.size();
}
/*
* stat ÆÄÀÏÀ» ¿¾î¼ " "¹®ÀÚ¸¦ ±âÁØÀ¸·Î ÆĽÌÇؼ
* ¹è¿(vector)¿¡ Áý¾î³Ö´Â´Ù.
*/
vector<string> Proc::ProcParser(char *proc_file)
{
FILE *fp;
char buf[512] = {0x00,};
char field[80];
int index = 0;
unsigned int i, j = 0;
vector<string> vproc;
fp = fopen(proc_file, "r");
if (fp == NULL)
{
perror("error : ");
exit(0);
}
memset(field, 0x00, 80);
fgets(buf, 511, fp);
for(i = 0; i < strlen(buf); i++)
{
if (buf[i] != ' ' && i != (strlen(buf) -1))
{
field[j++] = buf[i];
}
else
{
if (index == 1)
{
field[strlen(field)-1] = 0x00;
vproc.push_back(field+1);
}
else
vproc.push_back(field);
memset(field, 0x00, 80);
j = 0;
index++;
}
}
fclose(fp);
return vproc;
}
/*
* ÆÄÀÏÀ̸§ÀÌ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù.
*/
int Proc::IsDigit(char *str)
{
int i;
for (i = 0; i < strlen(str); i++)
{
if (isdigit(str[i])==0)
return 0;
}
return 1;
}
|
À§¿¡¼ ¼³¸íÇÑ proc.cc¸¦ ÅëÇؼ stat¸¦ ºÐ¼®ÇÑ ÇÁ·Î¼¼½ºµ¥ÀÌŸ°¡ ¸¸µé¾îÁ³À½À¸·Î ÀÌÁ¦ ÀÌ°ÍÀ» °¡Áö°í ¿Í¼ ȸ鿡 Àû´çÈ÷ »Ñ·ÁÁà¾ß ÇÒ°ÍÀÌ´Ù. ´ÙÀ½Àº ÀÌ¿Í °ü·ÃµÈ ÇÔ¼öµéÀÌ´Ù. ÇÁ·Î¼¼¼¼ÀÇ CPU»ç¿ëÀ²À» °¡Á®¿À±â À§ÇÑ getcputime()ÇÔ¼ö¿Ü¿¡´Â º°Æ¯º°ÇÑ°Ç ¾øÀ»°ÍÀÌ´Ù.
include/qps.h
#ifndef _QPS_H_
#define _QPS_H_
#include "proc.h"
// ÇÁ·Î¼¼½º ¸ñ·ÏÀ» Àû´çÈ÷ °¡°øÇؼ Ãâ·ÂÇÑ´Ù.
int viewProc();
// °¢ÇÁ·Î¼¼½ºÀÇ CPU »ç¿ëÀ²À» ¾ò¾î¿Â´Ù.
int getcputime(ulong utime, ulong stime, ulong starttime, int seconds);
// OSÀÇ uptime(ºÎÆÃÈÄ Áö±Ý±îÁöÀÇ °¡µ¿½Ã°£)À» ¾ò¾î¿Â´Ù.
int uptime();
#endif
|
qps.cc
// Local Çì´õÆÄÀÏ
#include "qps.h"
// Ç¥ÁØ C++ Çì´õÆÄÀϵé
#include <iostream>
#include <vector>
#include <string>
// Ç¥ÁØ C Çì´õÆÄÀÏ
#include <stdio.h>
using namespace std;
/*
* ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®¸¦ ¾ò¾î¿Í¼ º¸±âÁÁ°Ô Ãâ·ÂÇÑ´Ù.
*/
int viewProc()
{
Proc *mproc;
unsigned i;
int pcpu;
int seconds = 0;
Plist ProcList;
mproc = new Proc;
mproc->MakeProcInfo();
// ÇÁ·Î¼¼½ºÁ¤º¸ ¸®½ºÆ®¸¦ ¾ò¾î¿Â´Ù.
ProcList = mproc->GetProcList();
int total_cpu = 0;
// OSÀÇ uptimeÀ» ¾ò¾î¿Â´Ù.
// ¾ò¾î¿Â Á¤º¸´Â ÇÁ·Î¼¼½ºÀÇ CPU »ç¿ëÀ²À» ±¸Çϱâ À§ÇÑ ±âÃÊÁ¤º¸·Î
// »ç¿ëµÈ´Ù.
seconds = uptime();
printf("%-10s %7s %7s %2s %16s %4s %9s\n", "USER", "PID", "PPID",
"ST", "NAME", "CPU", "VMEM");
printf("==============================================================\n");
for (i = 0; i < mproc->ProcNum(); i++)
{
// CPU»ç¿ëÀ²À» ¾ò¾î¿Â´Ù.
pcpu = getcputime(atol(ProcList[i].process[13].c_str()),
atol(ProcList[i].process[14].c_str()),
atol(ProcList[i].process[21].c_str()), seconds);
// º¸±âÁÁ°Ô Ãâ·ÂÇÑ´Ù.
printf("%-10s %7s %7s %2s %16s %2d.%d %9s\n", ProcList[i].username,
ProcList[i].process[0].c_str(),
ProcList[i].process[3].c_str(),
ProcList[i].process[2].c_str(),
ProcList[i].process[1].c_str(), pcpu/10, pcpu%10,
ProcList[i].process[22].c_str());
}
return 1;
}
/*
* ÇÁ·Î¼¼½ºÀÇ CPU»ç¿ëÀ²À» ¾ò±â À§Çؼ »ç¿ëÇÑ´Ù.
* utime : À¯Àú¸ðµå¿¡¼ ÇÁ·Î¼¼½º°¡ ½ºÄÉÁ층µÇ¸é¼ »ç¿ëÇÑ jiffies ¼öÀÌ´Ù.
* ÇÁ·Î¼¼½º°¡ ½ºÄÉÁ층µÉ¶§¸¶´Ù Áõ°¡µÇ´Â ¼öÄ¡ÀÌ´Ù.
* stime : Ä¿³Î¸ðµå¿¡¼ ÇÁ·Î¼¼½º°¡ ½ºÄÉÁ층µÇ¸é¼ »ç¿ëÇÑ jiffies ¼öÀÌ´Ù.
* starttime : ¿î¿µÃ¼Á¦°¡ ½ÃÀÛµÇ°í³ª¼ ¸î jiffies°¡ Áö³ÈÄ
* ÇÁ·Î¼¼½º°¡ ½ÃÀ۵Ǿú´ÂÁö
*/
int getcputime(ulong utime, ulong stime, ulong starttime, int seconds)
{
unsigned long long total_time;
int pcpu=0;
// À¯Àú jiffies ¿Í Ä¿³Î jiffies¸¦ ´õÇÑ´Ù.
total_time = utime + stime;
// 100Àº HZ°ªÀÌ´Ù. HZÀÌ ÀÛ¾ÆÁú¼ö·Ï context switching°¡ »¡¶óÁø´Ù.
// ÀÌ°ªÀº /usr/include/asm/param.h¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
// 100. ´ë½Å¿¡ (unsigned long long)HZ Á¤µµ·Î Äڵ带
// ÀÛ¼ºÇÏ´Â°Ô Á»´õ ¾ÈÀüÇÒ°ÍÀÌ´Ù. ¿©±â¿¡¼´Â Á÷°üÀûÀ¸·Î ¼³¸íÇϱâ
// À§Çؼ ÇϵåÄÚµùÇß´Ù.
seconds = seconds - (int)(starttime/100.);
if(seconds)
{
pcpu = (int)(total_time * 1000ULL/100.)/seconds;
}
return pcpu;
}
/*
* ¿î¿µÃ¼Á¦°¡ ºÎÆÃÇÏ°í ³ª¼ ¾ó¸¶ÀÇ ½Ã°£ÀÌ Áö³µ´ÂÁö
*/
int uptime()
{
FILE *fp;
char buf[36];
double stime;
double idletime;
if ((fp = fopen("/proc/uptime", "r")) == NULL)
{
perror("fopen error : ");
exit(0);
}
fgets(buf, 36, fp);
sscanf(buf, "%lf %lf", &stime, &idletime);
fclose(fp);
return (int)stime;
}
|
mainÇÔ¼ö´Ù. ´õÀÌ»ó ¼³¸íÇÒ ÇÊ¿äµµ ¾ø´Â °£´ÜÇÑ ÄÚµåÀÌ´Ù.
¿¹Á¦ main.cc
#include <iostream>
#include "qps.h"
int main(int argc, char **argv)
{
viewProc();
}
|
ÄÄÆÄÀÏÀº make¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. ´ÙÀ½Àº ¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ ȸéÀÌ´Ù.
±×·°Àú·° Àßµ¹¾Æ°¡´Â°É È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.
ÀÌ»ó procÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇؼ ¾î¶»°Ô ÇÁ·Î¼¼½ºÁ¤º¸¸¦ ¾ò¾î¿À´ÂÁö¿¡ ´ëÇؼ ¾Ë¾Æ°í, ÀÌ ¾ò¾î¿ÂÁ¤º¸¸¦ °¡°øÇؼ ½ÇÁ¦ °ü¸®ÀÚ³ª, ÇÁ·Î±×·¡¸Ó¿¡°Ô À¯¿ëÇÑ Á¤º¸·Î ¸¸µå´Â ¹æ¹ýÀ» ¾Ë¾Æº¸¾Ò´Ù.
½Ã°£ÀÌ ³²´Â´Ù¸é ¸î°¡Áö ´Ù¸¥ ºÎ°¡ÀûÀÎ ½Ã½ºÅÛÁ¤º¸±îÁö Æ÷ÇÔ½ÃÄѼ Top¿Í °°Àº Á»´õ °·ÂÇÑ ÇÁ·Î±×·¥À» ¸¸µå´Â°Íµµ Àç¹ÌÀÖÀ»°ÍÀÌ´Ù. ȤÀº QT, GTKµîÀ» ÀÌ¿ëÇؼ GUIȯ°æ¿¡¼ ÀÛµ¿ÇÏ´Â ½Ã½ºÅÛÇÁ·Î¼¼½º ¸ð´ÏÅ͸µ ÇÁ·Î±×·¥À» ¸¸µé¼öµµ ÀÖÀ»°ÍÀÌ´Ù.
|
|
|
|
|
|