ÇÁ·Î¼¼½º °Ë»çÇϱâ
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

ÇÁ·Î¼¼½º °Ë»çÇϱâ

1절. ¼Ò°³

À̹ø¿¡´Â ÇÁ·Î¼¼½º°¡ Á¤»óÀûÀ¸·Î ÀÛµ¿Çϰí ÀÖ´ÂÁö ±×·¸Áö ¾ÊÀºÁö¸¦ °Ë»çÇÏ´Â ÇÁ·Î¼¼½º °ü¸®±â¸¦ ÀÛ¼ºÇغ¸µµ·Ï ÇÒ°ÍÀÌ´Ù. ÀÌ °ü¸® ÇÁ·Î±×·¥Àº ¼Ö¶ó¸®½º¿Í ¸®´ª½º¿¡¼­ ÄÚµùµÇ°í Å×½ºÆ® µÉ°ÍÀÌ´Ù. ¼Ö¸®¸®½º¿Í Linux ¸¦ ¼±ÅÃÇÑ ÀÌÀ¯´Â ÇÊÀÚ°¡ ½±°Ô Á¢±ÙÇÒ¼ö ÀÖ´Â OS À̱⠶§¹®ÀÌ´Ù.

Ȥ½Ã¶óµµ ´Ù¸¥ Unix OS ¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ±âȸ°¡ »ý±ä´Ù¸é, ´Ù¸¥ ±âŸ Unix ¿¡¼­ÀÇ ÇÁ·Î¼¼½º °ü¸® ¹æ¹ý¿¡ ´ëÇØ¼­ °­Á¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.


2절. ÇÁ·Î¼¼½º °ü¸®±â

2.1절. ÇÁ·Î¼¼½º °ü¸®±â ¶õ?

¿ì¸®°¡ °ü¸®ÇÏ´Â ½Ã½ºÅÛ¿¡´Â ¼ö¸¹Àº ÇÁ·Î¼¼½º°¡ ÀÛµ¿Çϰí ÀÖÀ»°ÍÀÌ´Ù. ÀÌÁß ¾î¶² ÇÁ·Î¼¼½º´Â ¸Å¿ì Áß¿äÇØ¼­ Á×À¸¸é ¾ÈµÇ´Â ±×·± ÇÁ·Î¼¼½º°¡ ÀÖÀ» °ÍÀ̸ç, ¸¸¾à ÀÌ·± Áß¿ä ÇÁ·Î¼¼½º°¡ ÀÛµ¿À» ÁßÁö Çß´Ù¸é ÀÛµ¿ÀÌ ÁßÁöµÇ¾úÀ½À» °ü¸®ÀÚ°¡ ÀÎÁöÇÒ¼ö ÀÖµµ·Ï ½ÅÈ£¸¦ º¸³»ÁÖ´Â ¶Ç´Ù¸¥ ÇÁ·Î±×·¥ÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù.

ÀÌ ÇÁ·Î±×·¥Àº °ü¸®ÇؾߵǴ Áß¿ä ÇÁ·Î¼¼½º¸¦ Áö¼ÓÀûÀ¸·Î ¸ð´ÏÅ͸µ Çϰí ÀÖ´Ù°¡ ¹®Á¦°¡ »ý±æ°æ¿ì ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î °ü¸®ÀÚ¿¡°Ô Åëº¸ÇØ¾ß ÇÒ°ÍÀÌ´Ù. Å뺸 ¹æ¹ýÀ¸·Î´Â °¡Àå ³Î¸® ¾²Àϸ¸ÇÑ °ÍÀº TCP/IP ¼ÒÄÏ Åë½ÅÀ» ÀÌ¿ëÇÑ °ü¸®ÀÚ ÇÁ·Î±×·¥À¸·ÎÀÇ alert Àü¼ÛÀÌ ¾Æ¸¶ °¡Àå À¯¿ëÇÒ°ÍÀÌ´Ù. ÀÌ´Â ´ëºÎºÐÀÇ °æ¿ì °ü¸®ÀÚ¿Í °ü¸®ÇØ¾ßµÉ ÇÁ·Î¼¼½º¸¦ °¡µ¿ÁßÀÎ ½Ã½ºÅÛÀÌ ¿ø°ÝÀ¸·Î ¶³¾îÁ® Àֱ⠶§¹®ÀÏ °ÍÀÌ´Ù.


2.2절. ÇÁ·Î¼¼½º °ü¸®ÀÇ ¹æ¹ý

±âº»ÀûÀ¸·Î /proc ÆÄÀϽýºÅÛÀÇ Á¤º¸¸¦ ÀÌ¿ëÇÑ´Ù. /proc Àº ÇÁ·Î¼¼½ºÀÇ Á¤º¸¸¦ °¡Áö°í ÀÖ´Â Àӽà ÆÄÀÏ ½Ã½ºÅÛ(process information pseudo-filesystem) À¸·Î½á ¸ðµç ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½ºÀÇ ÀÚ¼¼ÇÑ Á¤º¸¸¦ °¡Áø´Ù.

´ëºÎºÐÀÇ Unix ½Ã½ºÅÛµéÀÌ /proc ÆÄÀϽýºÅÛÀ» äÅÃÇϰí Àִµ¥, /proc ÆÄÀϽýºÅÛÀ» ºÐ¼®ÇÔÀ¸·Î½á, ¾î¶² ÇÁ·Î¼¼½º°¡ ¾î¶²»óÅ·Π½ÇÇàµÇ°í ÀÖÀ¸¸ç, ¾î¶² ÇÁ·Î±×·¥À» ½ÇÇàÇß´ÂÁö, ¾î¶² ÆÄÀÏÀ» open Çϰí ÀÖ´ÂÁö, ¸Þ¸ð¸® »ç¿ëÀº ¾î¶°ÇÑÁö.. µîµî ÇÁ·Î¼¼½ºÀÇ ¸ðµç Á¤º¸¸¦ ¾Ë¾Æ³¾¼ö ÀÖ´Ù.

ÇÁ·Î¼¼½º °ü¸®ÀÇ ¹æ¹ýÀº °£´ÜÇÏ´Ù. /proc ÆÄÀϽýºÅÛÀ» Á¶»çÇØ¼­ °ü½ÉÀÖ¾î ÇÏ´Â ÇÁ·Î¼¼½º°¡ Á¦´ë·Î ÀÛµ¿Çϰí ÀÖ´ÂÁö È®ÀÎÇÏ¸é µÇ´Â °ÍÀÌ´Ù.


2.3절. ¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥¿¡ ´ëÇØ¼­

ÇÁ·Î¼¼½º°ü¸®¶ó´Â ÁÖÁ¦ ÀÚü°¡ ³Ê¹« ±¤¹üÀ§ ÇϹǷÎ, ¹üÀ§¸¦ Á» ÁÙÀ̵µ·Ï ÇϰڴÙ. ÀÓÀÇÀÇ ÇÁ·Î¼¼½º¸¦ °ü¸®ÇÏ´Â ¹æ½ÄÀÌ ¾Æ´Ñ ƯÁ¤ÇÑ ÇÁ·Î¼¼½º¸¦ °ü¸®ÇÏ´Â ¹æ½ÄÀ» äÅÃÇϵµ·Ï ÇÒ°ÍÀÌ´Ù.

¿ì¸®´Â ÀÌÀü¿¡ PIPE ÀÀ¿ë ¿¡¼­ fork&exec ±â¹ýÀ¸·Î sub ÇÁ·Î±×·¥À» ÀÚµ¿À¸·Î ½ÇÇà½ÃŰ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇß¾ú´Ù. ¿ì¸®´Â ±âÁ¸ÀÇ ÇÁ·Î±×·¥À» ¾à°£ ¼öÁ¤Çؼ­ »ý¼ºµÈ sub ÇÁ·Î±×·¥ÀÇ °ü¸®±îÁö °¡´ÉÇϵµ·Ï ÇÒ°ÍÀÌ´Ù.


2.3.1절. ÇÁ·Î¼¼½º

int main()
{
    ¼³Á¤ÆÄÀÏÀ» ÀоîµéÀδÙ.
    {
        ½ÇÇàÇØ¾ßµÉ sub ÇÁ·Î±×·¥ÀÇ ½ÇÇà¸íÀ» ÀоîµéÀδÙ. 
    }

    while(sub ÇÁ·Î±×·¥ ¸®½ºÆ®ÀÇ Å©±â¸¸Å­)
    {
        fork&exec ·Î sub ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù. 
        pipe ¸¦ ÅëÇÏ¿© ÀоîµéÀÎ sub ÇÁ·Î±×·¥ÀÇ pid ¸¦ °¡Á®¿Â´Ù. 
    }
    while(sub ÇÁ·Î±×·¥ÀÇ pid Å©±â¸¸Å­)
    {
        /proc/pid/exe ¸¦ Á¶»çÇÑ´Ù. 
        ¸¸¾à /proc/pid °¡ ¾ø°Å³ª.. ÀÖ´õ¶óµµ exe À̸§ÀÌ ´Ù¸£¸é 
        ÇÁ·Î¼¼½º¿¡ ÀÌ»óÀÌ »ý±ä°ÍÀ¸·Î ÆÇ´ÜÇÑ´Ù.  
    }
} 
				
ÇÁ·Î¼¼½º´Â ¸Å¿ì ¸íÈ®ÇÏ´Ù. Ưº°ÇÑ ±â¼úÀÌ ÇÊ¿äÇѰ͵µ ¾Æ´Ï¸ç ´ÜÁö /proc ÆÄÀÏ ½Ã½ºÅÛ¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¿Í, ÆÄÀϰü·Ã ¸î°¡Áö ÇÔ¼öÁ¤µµ¸¸ ¾Ë°í ÀÖÀ¸¸é µÈ´Ù.


2.3.2절. ÄÚµù

¾Æ·¡ÀÇ ÇÁ·Î±×·¥ÀÇ À̸§Àº proc_m.cc ·Î Çϵµ·Ï ÇÏÀÚ. ÄÚµå´Â ¼öÇà°¡´ÉÇÑ »óÅ·Π¸¸µå´Âµ¥¿¡ ÁßÁ¡À» µÎ¾úÀ¸¸ç, ¾Æ¸§´Ù¿î Äڵ带 ¸¸µé±â À§ÇÑ ºÎ°¡ÀûÀÎ ÀÛ¾÷¿¡´Â ½Å°æÀ» ¾²Áö ¾Ê¾Ò´Ù. ¾Æ·¡ÀÇ ÇÁ·Î±×·¥À» º¸±âÀü¿¡ ¹Ýµå½Ã PIPE ÀÀ¿ë À» ¸ÕÀú Àо±â ¹Ù¶õ´Ù.

¿¹Á¦ : proc_m.cc

#include <map>
#include <stdio.h>
#include <string>
#include <unistd.h>
#include <vector>

int main(int argc, char **argv)
{
    FILE *fp;    
    char buf[80];
    char info[20];
    int sub_pid;
    int my_pid;
    int pid;
    int mypipe[2];
    map<int, string> mpid; 

    // ½ÇÇà½Ãų ÇÁ·Î±×·¥ÀÇ ¸®½ºÆ®°¡ ÀÖ´Â ¼³Á¤ÆÄÀÏÀ» ÀоîµéÀδÙ. 
    fp = fopen("config.cfg", "r");

    while(fgets(buf, 80, fp) != NULL)
    {
        buf[strlen(buf) - 1] =0x00; 
        proc_info.push_back(buf);
    }
    fclose(fp);

    my_pid = getpid();
    pipe(mypipe);
    for (int i = 0; i < proc_info.size(); i++)
    {
        if (getpid() != my_pid)
            exit(0);


        pid = fork();
        if (pid == 0)
        {
            dup2(mypipe[1], 1);
            close(mypipe[0]);
            close(mypipe[1]);
            execl(proc_info[i].c_str(), proc_info[i].c_str(), NULL);
        }

        // ÆÄÀÌÇÁ¸¦ ÅëÇØ¼­ sub ÇÁ·Î±×·¥ÀÇ PID ¸¦ ÀоîµéÀ̰í, 
        // ÀÌ Á¤º¸¸¦ ÀÌ¿ëÇØ¼­ °Ë»çÇØ¾ßµÉ ÇÁ·Î±×·¥ÀÇ ¸®½ºÆ®¸¦ map Çü½ÄÀ¸·Î 
        // ÀÛ¼ºÇÑ´Ù.  
        read(mypipe[0], (void *)&sub_pid, sizeof(int));    
        mpid[sub_pid]=proc_info[i];
    }

    char proc_path[20];
    char exec_path[80];
    while(1)
    {
        memset(proc_path, 0x00, 20);
        memset(exec_path, 0x00, 80);
        map<int, string>::iterator mi=mpid.begin();
        while(mi != mpid.end())
        {
            sprintf(proc_path, "/proc/%d/exe", mi->first);
            if (readlink(proc_path, exec_path, 80) > 0) 
            {
                if (mi->second == exec_path)
                {
                    cout << "ok Process " << " : " << mi->first << endl;
                }
                else
                {
                    // ÀÌ»óÀÌ »ý±ä ÇÁ·Î¼¼½º´Â map ¿¡¼­ Á¦°Å½ÃŲ´Ù.
                    cout << mi->second <<" Process error" << endl;
                    mpid.erase(mi);    
                }
            }
            else
            {
                // ÀÌ»óÀÌ »ý±ä ÇÁ·Î¼¼½º´Â map ¿¡¼­ Á¦°Å½ÃŲ´Ù.
                cout << mi->second <<" Process error" << endl;
                mpid.erase(mi);    
            }
            *mi++;
        }
        cout << "==================" << endl;
        // 1ÃÊ´ÜÀ§·Î °Ë»çÇÑ´Ù. 
        sleep(1);
    }
    pause();
}
				
¿ì¼± °Ë»çÇØ¾ßµÉ ÇÁ·Î¼¼½ºÀÇ Á¤º¸ ÀúÀåÀ» À§Çؼ­ map À» »ç¿ëÇß´Ù. key ´Â PID °¡ µÇ¸ç, value ´Â PID ¿¡ ´ëÇÑ ½ÇÇà¸í·É À̸§ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº 1ÃÊ´ÜÀ§·Î map ÀڷᱸÁ¶¿¡ ÀúÀåµÇ¾î ÀÖ´Â ÇÁ·Î¼¼½º¸¦ °Ë»çÇÑ´Ù.

°¢ ½ÇÇàÇÁ·Î±×·¥ÀÇ ÇÁ·Î¼¼½º Á¤º¸´Â /proc ÀÇ ÀÚ½ÅÀÇ PID ¸¦ À̸§À¸·Î ÇÏ´Â µð·ºÅ丮 ¹Ø¿¡ ÀúÀåµÈ´Ù. ¿¹¸¦µé¾î PID À̸§ÀÌ 1660 ÀÌ¿´´Ù¸é PID 1660 ¿¡ ´ëÇÑ ÇÁ·Î¼¼½º Á¤º¸´Â /proc/1660 ¾Æ·¡¿¡ ÀúÀåµÇ°Ô µÈ´Ù.

/proc/pid µð·ºÅ丮 ¹Ø¿¡ º¸¸é exe ¶ó´Â ½Éº¼¸¯ ¸µÅ©µÈ ÆÄÀÏÀÌ Çϳª Á¸ÀçÇϴµ¥ À̰ÍÀÌ ¹Ù·Î ÇØ´ç PID ¿¡ ´ëÇÑ ½ÇÇà¸í·É À̸§À̵ȴÙ.

±×·¯¹Ç·Î ¿ì¸®´Â ÃÖÃÊ¿¡ ÇÁ·Î±×·¥À» ½ÇÇà½Ãų¶§ ÇÁ·Î±×·¥ÀÇ PID ¹øÈ£¿Í ½ÇÇàÇÁ·Î±×·¥ÀÇ À̸§À» ¾È´Ù¸é, /proc/pid/exe ÆÄÀÏÀ» Á¶»çÇÔÀ¸·Î½á, ÇÁ·Î¼¼½º°¡ Á¦´ë·Î ½ÇÇàµÇ°í ÀÖ´ÂÁö¸¦ °¨½ÃÇÒ¼ö ÀÖ°Ô µÈ´Ù.


2.3.3절. Å×½ºÆ®

ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ¸é ¾Æ·¡¿Í °°Àº °á°ú¸¦ º¸¿©ÁÙ°ÍÀÌ´Ù.

[root@localhost test]# ./proc_m
ok Process  : 3217
ok Process  : 3218
ok Process  : 3219
==================
ok Process  : 3217
ok Process  : 3218
ok Process  : 3219
==================
ok Process  : 3217
ok Process  : 3218
ok Process  : 3219
==================
....
				
ÀÌÁ¦ PID 3217 À» kill ¸í·ÉÀ» ÀÌ¿ëÇØ¼­ ÁßÁö ½ÃŰ°í ±×°á°ú¸¦ ¾Ë¾Æº¸ÀÚ. ±×·¯¸é proc_m Àº ´ÙÀ½°ú °°Àº ¸Þ½ÃÁö¸¦ È­¸é¿¡ Ãâ·ÂÇÒ°ÍÀÌ´Ù.
/usr/yundream/bin/proc1 Process error
ok Process  : 3218
ok Process  : 3219
==================
ok Process  : 3218
ok Process  : 3219
==================
...
				
process ¿¡ ¹®Á¦°¡ »ý°å´Ù´Â°ÍÀ» ŽÁöÇØ ³»°í, ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·Â½Ã۰í, ¹®Á¦°¡ »ý±ä process ´Â map ÀڷᱸÁ¶¿¡¼­ Á¦°ÅÇÑÈÄ ´ÙÀ½¹øºÎÅÍ °Ë»çÇÒ¶§´Â ¹®Á¦ÀÇ process ¸¦ °Ë»ç¿¡¼­ Á¦¿Ü ½ÃÄ×À½À» ¾Ë¼ö ÀÖ´Ù.


2.3.4절. °á°ú¿¡ ´ëÇÑ ºÐ¼®

À§ÀÇ ÇÁ·Î±×·¥Àº ƯÁ¤»óȲ¿¡¼­ /proc ÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇØ¼­ ¾î¶»°Ô ÇÁ·Î¼¼½ºÀÇ °ü¸®°¡ °¡´ÉÇÑÁö¿¡ ´ëÇÑ ¸ð½ÀÀ» º¸¿©ÁÖ°í ÀÖ´Ù. ºñ·Ï ƯÁ¤»óȲÀ̱ä ÇÏÁö¸¸, ±âº»ÀûÀÎ ¹æ¹ý¸¸ ¾È´Ù¸é ¾à°£ÀÇ ÀÀ¿ëÀ» ÅëÇÏ¿© Æø³ÐÀº »ç¿ëÀÌ °¡´ÉÇÒ°ÍÀÌ´Ù.

À§ÀÇ ÇÁ·Î±×·¥À» ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨·Î ¸¸µé¾î¼­ ¹®Á¦ »óȲÀ» ¼­¹ö·Î Àü¼ÛÇÒ¼ö ÀÖ°Ô ¸¸µé¸é ÀÌ ÀÚü°¡ Á¶±×¸¶ÇÑ SMS(½Ã½ºÅÛ °ü¸®ÇÏ´Â ¼ÒÇÁÆ®¿þ¾î) ÀÖ´Ù. ¶ÇÇÑ ¸¶À½¸¸ ¸Ô´Â´Ù¸é ps ¿Í °°Àº Àüü ÇÁ·Î¼¼½º¸¦ °ü¸®ÇÒ¼ö ÀÖ´Â ÇÁ·Î±×·¥ÀÇ Á¦ÀÛµµ °¡´ÉÇÏ´Ù. ÀÌ·¸°ÔµÈ´Ù¸é ¸¹Àº ±â´ÉÀ» Æ÷ÇÔÇϰí ÀÖ´Â SMS ÇÁ·Î±×·¥ÀÇ ÀÛ¼ºµµ °¡´ÉÇÒ°ÍÀÌ´Ù.

¿©±â¿¡¼­´Â ¼³¸íÇÏÁö ¾Ê°í ÀÖÁö¸¸ /proc/pid ¹ØÀÇ ÆÄÀÏÀ» ºÐ¼®Çϸé ÇØ´ç ÇÁ·Î¼¼½ºÀÇ È¯°æº¯¼ö, ¸Þ¸ð¸® »ç¿ë·®, cpu »ç¿ëÀ², process »óÅÂ(Á»ºñ, sleep, run), ºÎ¸ð PID µîÀÇ ¾ÆÁÖ »ó¼¼ÇÑ ÇÁ·Î¼¼½º Á¤º¸¸¦ °¡Á®¿Ã¼ö Àֱ⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ »ó¼¼ÇÑ Á¤º¸´Â man proc ¸¦ Âü°íÇϱ⠹ٶõ´Ù.


2.4절. ¼Ö¶ó¸®½º¿¡¼­ÀÇ ÀÀ¿ë

¸®´ª½ºÀÇ /proc ½Ã½ºÅÛÀ» º¸¸é ¸ðµç Á¤º¸°¡ text ÇüÅ·ΠÀúÀåµÇ¾î ÀÖÀ½À» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ±×·¯¹Ç·Î ¸®´ª½º¿¡¼­ ÇÊ¿äÇÑ ÇÁ·Î¼¼½º Á¤º¸¸¦ ¾Ë¾Æ³»°í ½Í´Ù¸é, Á¤º¸¸¦ °¡Áö°í ÀÖ´Â ÆÄÀÏÀ» open ÇÑ´ÙÀ½¿¡ À̸¦ ÆÄ½ÌÇϱ⸸ ÇÏ¸é µÈ´Ù.

±×·¯³ª ¼Ö¶ó¸®½ºÀÇ °æ¿ì¿¡´Â ÇÁ·Î¼¼½º Á¤º¸°¡ text °¡ ¾Æ´Ñ ±¸Á¶Ã¼ Çü½ÄÀ¸·Î ÀúÀåµÈ´Ù. ±×·¯¹Ç·Î ÇØ´ç Á¤º¸¸¦ ÀоîµéÀ̱â À§Çؼ­´Â ÇØ´ç ÇÁ·Î¼¼½º Á¤º¸¸¦ ÀúÀåÇϰí ÀÖ´Â ÆÄÀÏÀÇ ±¸Á¶Ã¼ Á¤º¸¸¦ ¾Ë°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù.

¶ÇÇÑ ÆÄÀÏÀÇ À̸§À̳ª Çü½Äµµ ¾à°£¾¿ Â÷À̰¡ ÀÖ´Ù. ¿¹¸¦ µé¾î ¸®´ª½º¿¡¼­´Â ÇØ´ç PIDÀÇ ½ÇÇàÆÄÀÏ À̸§À» °¡Á®¿À±â À§Çؼ­ /proc/pid/exe ½Éº¼¸¯ ¸µÅ©ÆÄÀÏÀÇ ¿øº»ÆÄÀÏÀ» °Ë»çÇÏ¸é µÇ¾úÁö¸¸ ¼Ö¶ó¸®½º´Â /proc/pid/psinfo ÀÇ ÆÄÀÏÀ» Àо Àû´çÇÑ ¸â¹öº¯¼ö·Î ±¸¼ºµÇ´Â ±¸Á¶Ã¼¿¡ ÀúÀåÇÑ´ÙÀ½ À̰ÍÀ» Àоîµé¿©¾ß ÇÑ´Ù.

À§ÀÇ ¸®´ª½º ¹öÁ¯À» ¼Ö¶ó¸®½º¿¡¼­ »ç¿ë°¡´ÉÇÑ ¹öÁ¯À¸·Î ¹Ù²Ù±â À§Çؼ­´Â /proc/pid/psinfo ÆÄÀÏÀ» Àоîµé¿©¼­ psinfo ±¸Á¶Ã¼¿¡ ´ã¾Æ¿À°í ÇÁ·Î¼¼½ºÀÇ À̸§À» ÀúÀåÇϰí ÀÖ´Â ¸â¹öº¯¼ö¸¦ Àоî¿À´Â ¹æ½ÄÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

typedef struct psinfo {
    int     pr_flag;        /* process flags */
    int     pr_nlwp;        /* number of lwps in process */
    pid_t   pr_pid;         /* unique process id */
    pid_t   pr_ppid;        /* process id of parent */
    pid_t   pr_pgid;        /* pid of process group leader */
    pid_t   pr_sid;         /* session id */
    uid_t   pr_uid;         /* real user id */
    uid_t   pr_euid;        /* effective user id */
    gid_t   pr_gid;         /* real group id */
    gid_t   pr_egid;        /* effective group id */
    uintptr_t pr_addr;      /* address of process */
    size_t  pr_size;        /* size of process image in Kbytes */
    size_t  pr_rssize;      /* resident set size in Kbytes */
    size_t  pr_pad1;
    dev_t   pr_ttydev;      /* controlling tty device (or PRNODEV) */
        /* The following percent numbers are 16-bit binary */
        /* fractions [0 .. 1] with the binary point to the */
        /* right of the high-order bit (1.0 == 0x8000) */
    ushort_t pr_pctcpu;     /* % of recent cpu time used by all lwps */
    ushort_t pr_pctmem;     /* % of system memory used by process */
    timestruc_t pr_start;   /* process start time, from the epoch */
    timestruc_t pr_time;    /* usr+sys cpu time for this process */
    timestruc_t pr_ctime;   /* usr+sys cpu time for reaped children */
    char    pr_fname[PRFNSZ];       /* name of execed file */
    char    pr_psargs[PRARGSZ];     /* initial characters of arg list */
    int     pr_wstat;       /* if zombie, the wait() status */
    int     pr_argc;        /* initial argument count */
    uintptr_t pr_argv;      /* address of initial argument vector */
    uintptr_t pr_envp;      /* address of initial environment vector */
    char    pr_dmodel;      /* data model of the process */
    char    pr_pad2[3];
    int     pr_filler[7];   /* reserved for future use */
} psinfo_t;
			
¿©±â¿¡ º¸¸é pr_fname À̶õ ¸â¹öº¯¼ö°¡ º¸Àϰǵ¥, À̰ÍÀÌ ÇØ´ç PID ¿¡ ´ëÇÑ ½ÇÇàÆÄÀÏ ¸íÀ» ´ã°í ÀÖ´Ù. ±×·¯¹Ç·Î PID ÀÇ ½ÇÇàÆÄÀϸíÀ» ÀоîµéÀ̱â À§Çؼ­´Â
struct psinfo pinfo;
fd = open("/proc/pid/psinfo", O_RDONLY);
read(fd, (void *)&pinfo, sizeof(pinfo));
cout << "exec is " << pinfo.pr_fname << endl;
			
°ú °°ÀÌ ÇÁ·Î±×·¥À» ¾à°£ ¼öÁ¤ÇØ¾ß ÇÒ°ÍÀÌ´Ù.

¾î¶µç Á¤º¸¸¦ °¡Á®¿À´Â ¹æ½Ä¿¡´Â ¾à°£ Â÷À̰¡ ÀÖ±äÇÏÁö¸¸, ÇÁ·Î¼¼½º Á¤º¸¸¦ °¡Á®¿À´Â ±âº»¹ýÄ¢Àº ¸®´ª½º³ª ¼Ö¶ó¸®½º³ª º°Â÷À̰¡ ¾øÀ½À» ¾Ë¼ö ÀÖ´Ù.

¼Ö¶ó¸®½º¿¡¼­ man proc ¸¦ Çϸé ÀÌ·¯ÇÑ Á¤ÀÇµÈ ±¸Á¶Ã¼¿Í ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀ» °¡Á®¿Ã¼ö ÀÖ´Ù.


3절. °á·Ð

ÀÌ»ó °£´ÜÇÑ ÇÁ·Î¼¼½º °ü¸®¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. ´À²¼°ÚÁö¸¸ ¾Æ¸¶µµ Á¶±Ý¸¸´õ ½Å°æÀ» ¾²¸é, ²Ï ¸¹Àº ½Ã½ºÅÛ Á¤º¸¸¦ ¾Ë·ÁÁÖ´Â SMS ÇÁ·Î±×·¥ÀÇ Á¦ÀÛÀÌ °¡´ÉÇÒ°ÍÀ̶õ »ý°¢ÀÌ µé°ÍÀÌ´Ù.

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