fork - whdlgp/system_programming_pra GitHub Wiki
λ΄κ° μ£Όλ‘ μ°λ RTOS νκ²½μμλ μ°λλ(ν μ€ν¬) νλλ 무νλ°λ³΅λ¬Έ μ΄μκ³ , μ€μΌμ€λ¬λ μ°μ μμμ μν΄ μ΄λ€ ν μ€ν¬λ₯Ό μ€νμν¬μ§ κ²°μ νλ λΉμ μ ν λ°©μ μ΄μλ€.
κ·Έλ°λ° 리λ μ€ νκ²½μμ μ¬μ©νλ forkλΌλ λ μμ λμμ λ΄κ° μκ°νλ λ©ν° νλ‘μΈμ€ νλ‘κ·Έλλ° νκ³ μ‘°κΈ λλμ΄ λ¬λλ€. νλμ νλ‘μΈμ€κ° λλ€κ°, forkλΌλ ν¨μλ₯Ό λ§λ κ²½μ° μ¬λΌμλ§λ₯ λΆμ΄νλ€. μ΄λ μλ λλ νλ‘μΈμ€λ λΆλͺ¨ νλ‘μΈμ€κ° λκ³ , λΆμ΄λ νλ‘μΈμ€λ λΆμ΄μ λΆλͺ¨ νλ‘μΈμ€μ κΈ°μ΅μ κ°μ§κ³ μλ μμνλ‘μΈμ€κ° λλ€(μ§κ·Έλ½;).
forkμ 리ν΄κ°μ λ€μκ³Ό κ°λ€.
- μμ νλ‘μΈμ€λ 0μ 리ν΄κ°μ λ°λλ€.
- λΆλͺ¨ νλ‘μΈμ€λ μμ νλ‘μΈμ€μ pid(νλ‘μΈμ€ ID)λ₯Ό λ°λλ€.
- λΆμ΄μ΄ μ μλλ©΄ -1
#include <stdio.h>
int main(void)
{
int pid;
printf("[%d] process start \n", getpid());
pid = fork();
printf("[%d] process : return value %d \n", getpid(), pid);
return 0;
}
μ€ννλ©΄ λμΆ© λ€μκ³Ό κ°μ΄ λμ¨λ€.
[4044] process start
[4044] process : return value 4045
[4045] process : return value 0
첫λ²μ§Έ printf λ¬Έμμ νμ λκ³ μλ νλ‘μΈμ€μ pid κ°μ 보μ¬μ€λ€.
λλ²μ§Έ printf λ¬Έμ λΆλͺ¨, μμμ΄ λλμ΄μ Έμ, λΆλͺ¨μͺ½μ μμμͺ½(4045) pid κ°μ forkμ 리ν΄κ°μΌλ‘ λ°λ κ²μ λ³Ό μ μλ€. λΆμ΄λ μμμ 0μ 리ν΄κ°μ λ°λλ€.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int pid;
pid = fork();
if(pid == 0)//μμ νλ‘μΈμ€
{
printf("[child] : Hello, world pid = %d \n", getpid());
}
else // λΆλͺ¨ νλ‘μΈμ€
{
printf("[parent] : Hello, world pid = %d \n", getpid());
}
return 0;
}
[parent] : Hello, world pid = 5243
[child] : Hello, world pid = 5244
μ΄λ²μ forkμ 리ν΄κ°μ μμ©νμ¬, λΆλͺ¨μ μμ νλ‘μΈμ€κ° μλ‘ λ€λ₯Έ μΌμ νκ²λ λ§λλ μμ λ€. if λ¬Έμ μ΄μ©νμ¬ forkμ 리ν΄κ°μ΄ 0μΌλ μμ, λ€λ₯Έκ°(μμ pid) μΌλ λΆλͺ¨ νλ‘μΈμ€μ μΌλ‘ λλ΄λ€.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int pid1, pid2;
pid1 = fork();
if(pid1 == 0)
{
printf("[child 1] Hello, world! pid = %d\n", getpid());
exit(0);
}
pid2 = fork();
if(pid2 == 0)
{
printf("[child 2] Hello, world! pid = %d\n", getpid());
exit(0);
}
return 0;
}
μ΄λ²μ forkλ₯Ό λλ² μ¬μ©νμλ€.
[child 1] Hello, world! pid = 5368
[child 2] Hello, world! pid = 5369
첫λ²μ§Έ fork ν 첫λ²μ§Έ μμ νλ‘μΈμ€κ° μμ±λμ΄ printf λ¬Έ μΆλ ₯ν μ’
λ£νλ€.
λλ²μ§Έ fork ν λλ²μ§Έ μμ νλ‘μΈμ€κ° μμ±λμ΄ printf λ¬Έ μΆλ ₯ν μ’
λ£νλ€.
μ΄λ λλ€ λΆλͺ¨ νλ‘μΈμ€μμ λΆμ΄λ νλ‘μΈμ€μ΄λ€.
μ΄λ²μ λΆλͺ¨ μμκ°μ μ νν(μ΄λ κ² ννν΄λ λλμ§λ λͺ¨λ₯΄κ² λ€.)λ₯Ό μν΄ wait λΌλ ν¨μλ₯Ό μ¬μ©ν΄ λ³Έλ€.
λΆλͺ¨, μμ νλ‘μΈμ€λ‘ λλλ λ§μ½ λΆλͺ¨ νλ‘μΈμ€κ° λ¨Όμ μ’
λ£λ κ²½μ°, μμ νλ‘μΈμ€λ κ³ μ νλ‘μΈμ€κ° λλ€κ³ νλ€(νμ΅;). λλ¬Έμ μ λ§νλ©΄ μμ νλ‘μΈμ€ λΆν° μ£½μ΄κ³ λΆλͺ¨ νλ‘μΈμ€λ₯Ό μ£½μ΄λκ² μ’λ€κ³ νλ€. waitλ μμ νλ‘μΈμ€κ° μ£½μλκΉμ§ κΈ°λ€λ¦¬λ ν¨μλΌκ³ 보면 λλ€.
wait μ κ²½μ° κ°μ₯ λ¨Όμ μ£½μ μμ νλ‘μΈμ€ μμΌλ‘ μ§νλλ€.
μμ λ₯Ό 보λκ² λ«λ€.
#include <stdio.h>
#include <stdlib.h>
#include <wait.h>
int main(void)
{
int pid, child, status;
printf("[%d] parent process start\n", getpid());
pid = fork();
if(pid == 0)
{
printf("[%d] child process start\n", getpid());
exit(1);
}
child = wait(&status);//1 -> 1 0000 0000 == 256
printf("[%d] child process %d exit\n", getpid(), child);
printf("\t exit code %d\n", status >> 8);
}
[5519] parent process start
[5520] child process start
[5519] child process 5520 exit
exit code 1
fork ν μμ νλ‘μΈμ€ ꡬκ°μμ exit(1)λ‘ exitλΌλ ν¨μμ 1μ λ£μ΄μ£Όκ³ μ’ λ£νλ€. λ£μ΄μ€ 1μ wait ν¨μμμ μΈμ statusλ‘ μ λ¬νλλ°, μ λ¬νλ κ³Όμ μμ μ‘°κΈ μ΄μνκ² μ λ¬λλ€. 1μ μ λ¬νλ©΄ 1μ 8μΉ(1μ μΌμͺ½μΌλ‘ 8λ² μ¬ννΈ)μ κ°μ΄ μ λ¬λλ€. 1μ£Όλ©΄ 256μ κ°μ΄ statusμ μ μ₯λλ€.
λ§μ½ λ§μ§λ§
printf("\t exit code %d\n", status >> 8);
μμ >> 8 μ ν΄μ£Όμ§ μμ κ²½μ° 256μ΄ μΆλ ₯ λ κ²μ΄λ€.
waitμ λ°νκ°μ μ’ λ£λ μμ νλ‘μΈμ€ μ΄λ©°, μ μ’ λ£κ° μλκ±°λ νλ©΄ -1μ΄ λ°νλλ€.
wait(μνκ° μ μ₯ν λ²νΌ ν¬μΈν°)
μμλ‘ μμ νλ‘μΈμ€μ€ μ무거λ μ£½μΌλ©΄ λ°νλλ ν¨μ.
μλ‘ statusλΌλ λ²νΌμ μμλ‘ μ£½μ μμμ κ°μ μ μ₯νλ€λ©΄
int status;
wait(&status);
μ κ°μ΄ μ¬μ©νλ©΄ λλ€.
waitpid(pidκ°, μνκ° μ μ₯ν λ²νΌ ν¬μΈν°, μ΅μ
)
- 0 : νμ μμ μ κ·Έλ£Ήκ³Ό κ°μ μμ νλ‘μΈμ€λ₯Ό κΈ°λ€λ¦°λ€.
- -1 : μμλ‘ μ무 μμ νλ‘μΈμ€λ μ£½λμ§ κΈ°λ€λ¦°λ€.
- μμ(pidκ°) : μΈμλ‘ λ£μ΄μ€ pid λ₯Ό κ°μ§ μμ νλ‘μΈμ€κ° μ£½λμ§ κΈ°λ€λ¦°λ€.
- 0 : μμ νλ‘μΈμ€κ° μ£½μλκΉμ§ κΈ°λ€λ¦°λ€.
- WNOHANG : μμ νλ‘μΈμ€κ° μ£½μλκΉμ§ κΈ°λ€λ¦¬μ§ μλλ€.
μμ νλ‘μΈμ€κ° μ΄μμμΌλ©΄ 0μ λ°ννλ€.
μμ νλ‘μΈμ€κ° μ£½μμΌλ©΄ μμ νλ‘μΈμ€μ pid κ°μ λ°ννλ€.