๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์šด์˜์ฒด์ œ

[Linux] deamon๊ณผ fork ์ด์•ผ๊ธฐ

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 4. 13.

 

 

โœ… PID์™€ PPID

๋ฆฌ๋ˆ…์Šค์—์„œ ps๋ช…๋ น์–ด๋Š” ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค. ps -al๋กœ ์ž์„ธํ•œ ๋ชฉ๋ก์„ ๋ณด๋ฉด pid์™€ ppid๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, pid๋Š” process id, ppid๋Š” parent process id๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ps ๋ช…๋ น์–ด ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์ด๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์–ธ์ œ ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ ์‹œํ‚ฌ ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ๋Œ€๊ธฐํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค๊ฐ€ ๋ถ€ํŠธ๋˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด init์ธ๋ฐ, ๋ฆฌ๋ˆ…์Šค์˜ ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์œ ๋‹‰์Šค์˜ ๋ชจ๋“  ๋ช…๋ ์–ด ํ”„๋กœ๊ทธ๋žจ์€ init ํ”„๋กœ๊ทธ๋žจ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.

 

 

init์ด PID๊ฐ€ 1์ž„์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. pid๊ฐ€ ๋น ๋ฅผ ์ˆ˜๋ก ๋จผ์ € ์‹คํ–‰๋œ ํ”„๋กœ์„ธ์Šค์ด๋ฏ€๋กœ ๋ฆฌ๋ˆ…์Šค๊ฐ€ ์‹œ์ž‘๋˜๋ฉด์„œ ๊ฐ€์žฅ ๋จผ์ € init์ด ์‹คํ–‰๋์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

โœ… deamon

๊ธฐ๋ณธ์ ์œผ๋กœ '์„œ๋ฒ„'์˜ ์ปจ์…‰์€ ๋ฌดํ•œ๋ฃจํ”„(Infinite loop) ๊ธฐ๋ฐ˜์ด๋‹ค. ์ƒ๊ฐํ•ด ๋ณด์ž. ์ˆ˜๋งŽ์€ Input์ด ์žˆ๋Š” ๋ฐ ํด๋ผ์ด์–ธํŠธ(์‚ฌ์šฉ์ž)๊ฐ€ ์–ธ์ œ, ์–ด๋–ค Input์„ ์ž…๋ ฅํ•  ์ง€๋Š” ๋ชจ๋ฅธ๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์˜ˆ์ธกํ•ด์„œ ๊ทธ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚จ ๋‹ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋Œ€๊ธฐํ•˜๋Š” ์ปจ์…‰์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌดํ•œ๋ฃจํ”„ ํ”„๋กœ์„ธ์Šค๊ฐ€ foreground์—์„œ ์‹คํ–‰๋ ๊นŒ? ๋งŒ์•ฝ foreground์—์„œ ์‹คํ–‰๋œ๋‹ค๋ฉด ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†์„ ๋ฟ๋”๋Ÿฌ, ๋ฌดํ•œ๋ฃจํ”„์˜ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ๋Œ€๊ธฐํ•˜๋Š” ๋นˆ ํ™”๋ฉด๋งŒ ๋ณด๊ณ  ์žˆ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌดํ•œ๋ฃจํ”„ ํ”„๋กœ์„ธ์Šค๋Š” background ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ฉฐ ์ด๋ฅผ ๋ฐ๋ชฌ(daemon)์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ background ํ”„๋กœ์„ธ์Šค์™€ ๋ฐ๋ชฌ์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. background ํ”„๋กœ์„ธ์Šค์˜ ppid๋Š” ํ„ฐ๋ฏธ๋„(shell)์ด๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ background๋กœ ์‹คํ–‰์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค๋Š” ํ„ฐ๋ฏธ๋„์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค์˜ ppid๋Š” 1์ด๋‹ค. ์ด ๋ง์€ ์šด์˜์ฒด์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ํ•œ ์˜์›ํžˆ background์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.  Windows์—์„œ๋Š” service์ฐฝ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฐ๋ชฌ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œˆ๋„์šฐ์˜ ์„œ๋น„์Šค ํ™”๋ฉด

 

 

โœ… fork

๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด fork์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. fork()๋Š” ์ž์‹ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์Šคํ…œ ํ•จ์ˆ˜์ด๋‹ค. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ fork()๋ฅผ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ppid๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ(exit)๋˜๋ฉด, ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œ๋‹ค. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ๋ผ์กŒ์œผ๋‹ˆ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ppid๋Š” ์šด์˜์ฒด์ œ๋กœ ๊ท€์†๋˜๋ฉฐ 1์ด ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ œ์–ดํ•˜์ง€ ์•Š๋Š” ๋ฐ๋ชฌ(daemon) ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ํ˜„์žฌ ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋‹ค. ์ผ์ข…์˜ ์—”์ง„์ด์ž ์„œ๋ฒ„ ์—ญํ• ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด์ œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ๋ณด์ž.

 

#include <unistd.h>
#include <sys/signal.h>
#include <iostream>
#include "GoGo.h"

int main(int argc, char* argv[])
{
    if( (pid = fork()) < 0 ) 
    {
        ostringstream ss;
        ss << "[ERROR](" << __FILE__ << ", " << __LINE__ <<") " << "Can't Fork" << endl;
        cerr << ss.str() << endl;
        exit(errno);
    }
    else if( pid != 0 )
        exit(0);

    ofstream pidFile(pidPath.c_str(), ios_base::trunc);
    if( pidFile.fail()) 
    {
        ostringstream ss;
        ss << "[ERROR](" << __FILE__ << ", " << __LINE__ << ") " << "Can't Open File: " << endl;
        cerr << ss.str();
        return 0;
    }
    else 
    {
        pidFile << getpid();
        pidFile.close();
    }

    GoGo go;
    go.letGo();

}

 

main ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘ํ•˜์ž๋งˆ์ž fork()๋ฅผ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜ธ์ถœํ•œ fork() ํ•จ์ˆ˜ ๋ถ€ํ„ฐ ์‹œ์ž‘๋œ๋‹ค. ๋ถ€๋ชจ์˜ ๋ณ€์ˆ˜, ์Šคํƒ, ํž™ ๋ฐ์ดํ„ฐ๋Š” ๋ฌผ๋ก  PCB(Process Control Block) ์ •๋ณด๊นŒ์ง€ ๊ฐ–๊ณ  ํƒœ์–ด๋‚œ๋‹ค. fork()๋ฅผ ํ˜ธ์ถœํ•œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋„ fork()๋ฅผ ํ†ตํ•ด ๋˜ ๋‹ค์‹œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•œ ๋’ค ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ exit()์œผ๋กœ ์ข…๋ฃŒ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  pid๋ฅผ ๋ณ„๋„์˜ pidFile์— ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐœ๋ฐœ์ž ํ˜น์€ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ pidFile์„ ์ฝ์–ด์„œ pid๋ฅผ ์ฐพ๊ณ , pid๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์— ์‹œ๊ทธ๋„(SIGUSR1)์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•จ์ด๋‹ค. 

 

 

์ด๋ ‡๊ฒŒ ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถ”๊ณ  letGo()๋ฅผ ํ˜ธ์ถœํ•ด ๋ณธ๊ฒฉ์ ์ธ ๋ฌดํ•œ๋ฃจํ”„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.

 

๋Œ“๊ธ€