โ 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()๋ฅผ ํธ์ถํด ๋ณธ๊ฒฉ์ ์ธ ๋ฌดํ๋ฃจํ ํ๋ก์ธ์ค๊ฐ ์์๋๋ค.
'์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ฐ์๋ฉ๋ชจ๋ฆฌ(Virtual Memory)๋ ๋ฌด์์ผ๊น? (0) | 2023.08.23 |
---|---|
Vim์์ Auto Indent ์ฌ์ฉ (0) | 2023.05.30 |
์ปดํจํฐ ์ฑ๋ฅ ํฅ์ ๊ธฐ์ (0) | 2023.01.07 |
๊ต์ฐฉ์ํ(DeadLock) (0) | 2023.01.03 |
Context Switching(๋ฌธ๋งฅ ๊ตํ) (0) | 2023.01.02 |
๋๊ธ