๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

Linux ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• (spawn, fork, exec) ๋ณธ๋ฌธ

Study/Back-End

Linux ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• (spawn, fork, exec)

Shinjio 2025. 3. 3. 15:28
๋ฐ˜์‘ํ˜•

ํŒŒ์ด์ฌ์€ GIL ํŠน์„ฑ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์—์„œ ์ œํ•œ์„ ๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ด์ฌ์€ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ณ‘๋ น ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ , ์ œ๋Œ€๋กœ ๋œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. 

 

** GIL(Global Interpreter Lock) : ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ์ด ํŒŒ์ด์ฌ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์ง€๋งŒ, ๋™์‹œ์— ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค. 

 


๐Ÿ“ fork()

fork()๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค(๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค)๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค(child process)๋ผ๊ณ  ํ•˜๋ฉฐ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์ง€๋งŒ, ๋ณ„๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋™์ž‘ํ•œ๋‹ค. 

 

  • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ ์ฝ”๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ์˜์—ญ์„ ๊ฐ€์ง
  • Linux์™€ ๊ฐ™์€ ์ผ๋ถ€ ์šด์˜์ฒด์ œ์—์„œ๋Š” Copy-On-Write(COW, ์ง€์—ฐ ๋ณต์‚ฌ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ •๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ 
  • ๋ฆฌํ„ด ๊ฐ’:
    • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค: fork() ํ˜ธ์ถœ ์‹œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID ๋ฐ˜ํ™˜
    • ์ž์‹ ํ”„๋กœ์„ธ์Šค: 0 ๋ฐ˜ํ™˜
    • ์‹คํŒจ ์‹œ -1  ๋ฐ˜ํ™˜
#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork(); //fork() ํ˜ธ์ถœ ํ›„ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฑฐ์˜ ๋™์‹œ์— ์‹คํ–‰๋จ

    if (pid > 0) {
        printf("๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค: ์ž์‹ PID = %d\n", pid); //๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ์‹คํ–‰๋จ
    } else if (pid == 0) {
        printf("์ž์‹ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์ค‘\n"); //์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ์‹คํ–‰๋จ
    } else {
        perror("fork ์‹คํŒจ");
    }
    return 0;
}

 

fork() ์ดํ›„, ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ™˜๊ฒฝ์—์„œ๋Š” ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜๋„ ์žˆ์œผ๋‚˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ์šด์˜์ฒด์ œ์˜ ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ค„๋ง ์ •์ฑ…๊ณผ ์‹œ์Šคํ…œ์˜ ๋ถ€ํ•˜, ์šฐ์„ ์ˆœ์œ„ ๋“ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ํ•ญ์ƒ ์ผ์ •ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ wait()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€  ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.  

 

Copy-On-Write(COW)
์“ฐ๊ธฐ ์‹œ ๋ณต์‚ฌํ•œ๋‹ค๋Š” ๋œป์œผ๋กœ ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋™์ผํ•œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์ฝ๊ธฐ๋งŒ ํ•  ๋•Œ์—๋Š” ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ , ์–ด๋Š ํ•œ ์ชฝ์—์„œ ์“ฐ๊ธฐ ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ์‹œ์ ์— ํ•ด๋‹น ํŽ˜์ด์ง€๋งŒ ์‹ค์ œ๋กœ ๋ณต์‚ฌํ•œ๋‹ค. 
Copy-On-Write ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด fork() ํ˜ธ์ถœ ์งํ›„ ๋ฐ”๋กœ exec()๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, ๋Œ€๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์‹œ์Šคํ…œ๊ณผ ์ž์›์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค. 

[ fork() ์งํ›„ ์ƒํƒœ ] 
- ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋™์ผํ•œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด
- ์ฝ๊ธฐ(read)๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€ โ”‚ ← ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋™์ผํ•œ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ 
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

[ ์ž์‹์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•  ๋•Œ (์“ฐ๊ธฐ ์—ฐ์‚ฐ) ]
- ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์šด์˜์ฒด์ œ๋Š” ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰
- ๋ณ€๊ฒฝํ•˜๋ ค๋Š” **ํŽ˜์ด์ง€๋งŒ ๋ณต์‚ฌํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น
- ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋Š” ๊ณ„์† ๋ถ€๋ชจ์™€ ์ž์‹์ด ๊ณต์œ 

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๋ถ€๋ชจ์˜ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€ โ”‚ โ”‚ ์ž์‹์˜ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€ โ”‚ ← ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ• ๋‹น
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

 

๐Ÿ“Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ "ํŽ˜์ด์ง€(Page)"๋ž€?

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ์ •๋œ ํฌ๊ธฐ(์ผ๋ฐ˜์ ์œผ๋กœ 4KB)๋กœ ๋‚˜๋ˆˆ ์ž‘์€ ๋ธ”๋ก

์šด์˜์ฒด์ œ(OS)๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํŽ˜์ด์ง€(Page) ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ž‘์€ ๋‹จ์œ„(ํŽ˜์ด์ง€)๋กœ ๋‚˜๋‰˜์–ด ์žˆ์œผ๋ฉฐ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. 

 

(1) fork() ํ˜ธ์ถœ ์งํ›„ (๋ถ€๋ชจ์™€ ์ž์‹์ด ๊ฐ™์€ ํŽ˜์ด์ง€ ๊ณต์œ )

      ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค          ์ž์‹ ํ”„๋กœ์„ธ์Šค
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ํŽ˜์ด์ง€ 1 โ”‚ ← ๊ฐ™์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ 
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ํŽ˜์ด์ง€ 2 โ”‚ ← ๊ฐ™์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ 
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ํŽ˜์ด์ง€ 3 โ”‚ ← ๊ฐ™์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ 
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ํŽ˜์ด์ง€ 4 โ”‚ ← ๊ฐ™์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ 
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

 

(2) ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ "ํŽ˜์ด์ง€ 3"์„ ์ˆ˜์ •(์“ฐ๊ธฐ ์—ฐ์‚ฐ) ํ•˜๋ ค๊ณ  ํ•จ

    ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค            ์ž์‹ ํ”„๋กœ์„ธ์Šค
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ํŽ˜์ด์ง€ 1 โ”‚ ← ๊ณต์œ ๋จ
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ํŽ˜์ด์ง€ 2 โ”‚ ← ๊ณต์œ ๋จ
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ํŽ˜์ด์ง€ 3 โ”‚ โŒ ์“ฐ๊ธฐ ๋ฐœ์ƒ → ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€ 3์ด ๋ณต์‚ฌ๋จ!
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ํŽ˜์ด์ง€ 4 โ”‚ ← ๊ณต์œ ๋จ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

 

fork๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ์–ด๋–ค ์ž‘์—…์„ ์œ„์ž„ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์›น ์„œ๋ฒ„์ธ Apache๋Š” ์ฒ˜์Œ ๊ธฐ๋™๋œ ๋ถ€๋ชจ ๋ถ€๋กœ์„ธ์Šค๊ฐ€ fork๋ฅผ ํ†ตํ•ด ๋ช‡ ๊ฐœ์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œํ•ด๋‘”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ์ ‘์†์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ•ด๋‘์—ˆ๋”ฐ. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ ˆํ•˜๋Š” ์ผ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์‰˜(shell)์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์ด ๊ฒฝ์šฐ fork ํ›„ exec ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค. 

 


 

๐Ÿ“ exec()

exec() ๊ณ„์—ด ํ•จ์ˆ˜(execl, execp, execv, execve ๋“ฑ)๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ต์ฒดํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ฆ‰, ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฎ์–ด์”Œ์šฐ๊ณ  ์‹คํ–‰๋œ๋‹ค. 

**POSIX์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ exec ๊ณ„์—ด ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. 

POSIX(Portable Operationg System Interface)๋Š” ์œ ๋‹‰์Šค ๊ณ„์—ด ์šด์˜์ฒด์ œ์—์„œ ํ‘œ์ค€ํ™”๋œ API, ๋ช…๋ น์–ด, ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ •์˜ํ•œ ๊ทœ๊ฒฉ์ด๋‹ค. ์ฆ‰, ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ(OS)๊ฐ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์„ ๋งํ•œ๋‹ค. 

 

#include<stdio.h>
#include<unistd.h>

int main(int argc, char* argv[]){
    execl("/bin/ls", "/bin/ls", "-al", "/tmp", NULL);
    printf("hello world:\n");
}
[์ถœ์ฒ˜] [Linux] ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ๋ฐฉ๋ฒ•(fork, exec, spawn, posix-spawn) - ํŒŒ์ด์ฌ๊ณผ ๋…ธ๋“œ์—์„œ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ|์ž‘์„ฑ์ž ๋ฉ๊ฐœ

 

main ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ํ•˜๋ฉด execl() ์‹คํ–‰์„ ํ†ตํ•ด main() ํ”„๋กœ์„ธ์Šค๊ฐ€ bin/ls ํ”„๋กœ์„ธ์Šค๋กœ ๊ต์ฒด๋˜๋ฏ€๋กœ printf๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•ด hello world๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

 

ํ•จ์ˆ˜ ์„ค๋ช…
 execl() ์ธ์ž๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ
execle() ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋„ ์ถ”๊ฐ€๋กœ ์ „๋‹ฌ
execlp() ์‹คํ–‰ ํŒŒ์ผ์„ PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ๊ฒ€์ƒ‰
execv() ์ธ์ž๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ „๋‹ฌ
execvp() execv() + PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ๊ฒ€์ƒ‰
execve() ์‹คํ–‰ ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์ง€์ • + ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ „๋‹ฌ ๊ฐ€๋Šฅ (๊ฐ€์žฅ ์ €์ˆ˜์ค€ ํ•จ์ˆ˜)

 

  • ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์ง€๋งŒ PID๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€
  • ๊ธฐ์กด ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ์Šคํƒ, ํž™ ๋“ฑ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ต์ฒด๋จ
  • exec() ํ˜ธ์ถœ ์ดํ›„์—๋Š” ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ

 

1๏ธโƒฃ execl()

์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์‹คํ–‰ ํŒŒ์ผ์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ, ์‹คํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์ž๋ฅผ ํ•˜๋‚˜์”ฉ ์ง์ ‘ ๋‚˜์—ดํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค. 

 execl("/bin/ls", "ls", "-l", "-a", NULL);

 

2๏ธโƒฃ execle()

execl()๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ๋งˆ์ง€๋ง‰์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 char *env[] = { "MY_ENV=hello", NULL };

// ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ „๋‹ฌ ๊ฐ€๋Šฅ
execle("/bin/ls", "ls", "-l", NULL, env);

 

3๏ธโƒฃ execlp()

execl()์€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, execlp()๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ PATH์—์„œ ์ž๋™ ๊ฒ€์ƒ‰ํ•œ๋‹ค. 

// "ls" ์‹คํ–‰ (์ ˆ๋Œ€๊ฒฝ๋กœ ์—†์ด ์‹คํ–‰ ๊ฐ€๋Šฅ)
execlp("ls", "ls", "-l", NULL);

 

4๏ธโƒฃ execv()

execl()์€ ์ธ์ž๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ์ง์ ‘ ๋‚˜์—ดํ•ด์•ผ ํ•˜์ง€๋งŒ, execv()๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค. 

char *args[] = { "ls", "-l", NULL };

// "/bin/ls" ์‹คํ–‰, ์ธ์ž๋Š” ๋ฐฐ์—ด๋กœ ์ „๋‹ฌ
execv("/bin/ls", args);

 

5๏ธโƒฃ execve()

execv()์™€ ๋™์ผํ•˜์ง€๋งŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

char *args[] = { "ls", "-l", NULL };
char *env[] = { "MY_ENV=hello", NULL };

execve("/bin/ls", args, env);

 

6๏ธโƒฃ execvp()

execv()๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, execvp()๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ PATH์—์„œ ๊ฒ€์ƒ‰ํ•œ๋‹ค. 

char *args[] = { "ls", "-l", NULL };

execvp("ls", args);  // "ls" ์‹คํ–‰ (PATH์—์„œ ๊ฒ€์ƒ‰)

 


 

๐Ÿ“ spawn()

spawn()์€ fork()์™€ exec()๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. posix_spawn() ๋˜๋Š” spawn() ๊ณ„์—ด ํ•จ์ˆ˜(spawnl, spawnv ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Windows์™€ Unix ๊ณ„์—ด ์‹œ์Šคํ…œ์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

  • fork() ํ›„ exec()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์šด์˜์ฒด์ œ๊ฐ€ ์ตœ์ ํ™”๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํ–‰
  • ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ(P_NOWAIT, P_WAIT ๋“ฑ)
  • fork()์™€ exec()์„ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ์šฐ์ˆ˜ํ•  ์ˆ˜ ์žˆ์Œ

 

๐Ÿ“Œ spawn() vs fork() + exec()

fork-exec์™€ spawn์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ƒˆ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ์‹์ด๋‹ค. ๋‘ ๋ฐฉ์‹์€ ๋™์ผํ•œ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ๊ทธ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. 

 

1๏ธโƒฃ fork-exec ๋™์ž‘ ์›๋ฆฌ

fork(): ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๋ณต์ œ๋ณธ์ธ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๋•Œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์„ ๋ณต์‚ฌํ•œ๋‹ค. 

exec(): ์ƒ์„ฑ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์ƒํ–‰ ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ๋“œํ•˜๋„๋ก ํ•œ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” exec() ํ˜ธ์ถœ ํ›„ ๋ถ€๋ชจ์™€๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ๋‹ค. 

 

2๏ธโƒฃ spawn ๋™์ž‘ ์›๋ฆฌ

์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ง€์ •๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๋‹จ์ผ ํ•จ์ˆ˜์ด๋‹ค. fork()์™€ exec()์˜ ๊ธฐ๋Šฅ์„ ํ•ฉ์นœ ํ˜•ํƒœ๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฆ‰์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3๏ธโƒฃ fork-exec์˜ ๋ฌธ์ œ์ 

fork-exec๋Š” ๊ธฐ์กด ์‹œ์Šคํ…œ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ์„ฑ๋Šฅ๊ณผ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํŠนํžˆ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์ด๋‚˜ ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ์—์„œ ๊ทธ ๋ฌธ์ œ๊ฐ€ ๋” ๋‘๋“œ๋Ÿฌ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์š” ๋ฌธ์ œ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ, ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ, ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ƒ์† ๋ฌธ์ œ์ด๋‹ค. 

 

โœ” ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ(์Šค์™‘ ์˜์—ญ ๋ฌธ์ œ)

  • ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ๋น„์šฉ: fork()๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ณต์‚ฌํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋ณต์‚ฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒ๋œ๋‹ค. ํŠน์‹œ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๊ฐ€ ๋งŽ์ด ๋ณต์‚ฌ๋˜๋ฉด ์Šค์™‘ ์˜์—ญ์—์„œ ๋ฐ์ดํ„ฐ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. 
  • ์Šค์™‘ ์˜์—ญ์€ ์‹œ์Šคํ…œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ํ•˜๋“œ๋””์Šคํฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๊ณต๊ฐ„์ด๋‹ค. ๋””์Šคํฌ I/O๋Š” ๋งค์šฐ ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๋กœ ์ธํ•œ ์Šค์™‘ ์˜์—ญ ์‚ฌ์šฉ์€ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. 
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋ถ€๋ชจ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ณต์‚ฌ๋˜๋ฉด, ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ ธ ์Šค์™‘ ์˜์—ญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์ด ์ œํ•œ์ ์ผ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค. 
spawn()์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ํ•„์š”ํ•œ ์ž์›๋งŒ ํ• ๋‹นํ•˜๊ณ , ์ฆ‰์‹œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ๋น„์šฉ์ด ์ค„์–ด๋“ ๋‹ค. 

 

โœ” ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ

  •  fork()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ์ด๋•Œ ๋‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์šด์˜์ฒด์ œ์˜ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ฐœ์ž…ํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ํ•ด์•ผ ํ•œ๋‹ค. 
  • fork() ํ›„ ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋™์‹œ์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ๋ถˆํ•„์š”ํ•œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ๋ฐœ์ƒ์‹œ์ผœ ์‹œ์Šคํ…œ์˜ ์ „์ฒด ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
spawn()์€ ๋‹จ์ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ์ค„์—ฌ ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

 

โœ” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ƒ์†

  • fork() ํ˜ธ์ถœ ํ›„ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์ƒ์†์„ ๋ฐ›๋Š”๋‹ค. ์ด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ํŒŒ์ผ, ์†Œ์ผ“, ํŒŒ์ดํ”„ ๋“ฑ์˜ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•ธ๋“ค์ด๋‹ค. 
  • ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๋™์ผํ•œ ํŒŒ์ผ์„ ์—ด๊ณ  ์ž‘์—…ํ•  ๋•Œ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฆฌ์†Œ์Šค ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 
spawn()์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์ƒ์†์„ ๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฆฌ๋””๋ ‰์…˜ ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์ธ ํŒŒ์ผ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 


โœ ์š”์•ฝ

1. ๋ฆฌ๋ˆ…์Šค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ fork, exec, spawn์ด ์žˆ๋‹ค. 

2. fork๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

3. exec๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์—์„œ PID์™€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ๋ณ€๊ฒฝ ์—†์ด ๊ธฐ์กด์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋กœ ๋ฎ์–ด ์”Œ์–ด ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

4. spawn์€ fork-exec ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

5. ์ฐจ์ด์ ์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋กœ ๋ณต์ œ์‹œ ์ „์ฒด๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณต์ œํ•˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ๊ณผ ์‹คํ–‰์€ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ์ œ๊ฑฐํ•œ๋‹ค. 


๐Ÿ“– ์ฐธ๊ณ ์ž๋ฃŒ

https://myungsun-e.tistory.com/21

 

ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ๊ธฐ๋ฒ•

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

myungsun-e.tistory.com

https://blog.naver.com/PostView.naver?blogId=pjt3591oo&logNo=222774338068

 

[Linux] ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ๋ฐฉ๋ฒ•(fork, exec, spawn, posix-spawn) - ํŒŒ์ด์ฌ๊ณผ ๋…ธ๋“œ์—์„œ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ

์•ˆ๋…•ํ•˜์„ธ์š” ๋ฉ๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ์‹œ๊ฐ„์€ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ๋ฐฉ๋ฒ•์„ ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ง€๋‚œ๋ฒˆ์— ํ”„๋กœ์„ธ...

blog.naver.com

https://sunyzero.tistory.com/191

 

fork, vfork ๊ทธ๋ฆฌ๊ณ  posix_spawn ์ด์•ผ๊ธฐ

* TOC๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ๊ด€๊ณ„fork์™€ fork-execvfork์™€ ๋ฌธ์ œ์ posix_spawn์˜ ๋“ฑ์žฅ2์ค„ ๊ฒฐ๋ก  fork๋ž€?fork๋Š” ์œ ๋‹‰์Šค/๋ฆฌ๋ˆ…์Šค ๊ณ„์—ด์—์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ํ‘œ์ค€ ํ•จ์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ fork๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ

sunyzero.tistory.com

 

๋ฐ˜์‘ํ˜•