ν°μ€ν 리 λ·°
리λ μ€μμ λ΄κ° μνλ νλ‘μΈμ€λ₯Ό ν λΉνκΈ° μν΄, μ μ λ 벨μμ fork()λ₯Ό νμ©νμ¬ λμ μ€ν νλ‘κ·Έλ¨μ λΆλͺ¨λ‘ νλ μμ νλ‘μΈμ€λ₯Ό μμ±ν μ μλ€. fork()κ° μ΄λ€ μμΌλ‘ λμνλμ§ μ νν μ΄ν΄νμ§ λͺ»νλ€λ©΄, μμΉ μλ κ²°κ³Όλ₯Ό λ§λ€ μ μμΌλ―λ‘ μ 리ν΄λ³΄κ³ μ νλ€.
fork μ΄ν΄λ³΄κΈ°
리λ μ€μμ μμ κ°μ΄ `man fork`λ₯Ό μ λ ₯νλ©΄ `fork()`μ λν μ€λͺ μ΄ λμ¨λ€. κ°λ¨ν μ€λͺ νμλ©΄, `fork()`λ₯Ό νΈμΆνλ νλ‘μΈμ€, μ¦ λΆλͺ¨ νλ‘μΈμ€λ₯Ό κ·Έλλ‘ λ³΅μ ν μλ‘μ΄ νλ‘μΈμ€λ₯Ό μμ±νλ€.
λν, μ€ν κ²°κ³Όμ λ°λΌ λ°ν κ²°κ³Όλ μμ΄νλ€. μλ‘μ΄ νλ‘μΈμ€λ₯Ό ν λΉν μ μλ κ²½μ°λ `-1`μ λ°ννλ€. λΆλͺ¨ νλ‘μΈμ€μ κ²½μ° μμ±ν μμ νλ‘μΈμ€μ `pid`λ₯Ό λ°ννλ©°, μμ νλ‘μΈμ€μ κ²½μ° `0`μ λ°ννλ€.
void create_process()
{
pid_t pid = fork();
/* νλ‘μΈμ€λ₯Ό μμ±νμ§ λͺ»ν κ²½μ° */
if (pid < 0)
exit(EXIT_FAILURE);
/* λΆλͺ¨ νλ‘μΈμ€μΈ κ²½μ° */
if (pid != 0)
exit(EXIT_SUCCESS);
}
κ°λ¨νκ² μμ νλ‘μΈμ€λ₯Ό μμ±νλ ν¨μλ₯Ό μμ±νλ©΄ μμ κ°λ€. μμ νλ‘μΈμ€μ μ€ν μμΉλ fork() ν¨μλ₯Ό νΈμΆν μ΄νμ΄λ€. `pid`μ κ°μ λ°λΌ 2κ°μ§λ₯Ό μ²λ¦¬νμ¬μΌ νλ€. 첫 λ²μ§Έλ μλ‘μ΄ νλ‘μΈμ€λ₯Ό μμ±νμ§ λͺ»ν μνλ‘, νμ¬ μ€νν νλ‘κ·Έλ¨μ μ’ λ£μν€λ κ²μ΄λ€. (μν©μ λ°λΌ `fork()`λ₯Ό μ¬μλν μ λ μμ κ²μ΄λ€.) λ λ²μ§Έλ `pid`κ° 0μ΄ μλκ³ , μμ νλ‘μΈμ€κ° μμ±λ μνμμ λΆλͺ¨ νλ‘μΈμ€λ₯Ό μ’ λ£μν€λ κ²μ΄λ€.
Orphan process
Orphan process(κ³ μ νλ‘μΈμ€)λ₯Ό μ΄ν΄νμ¬μΌ, μμ νλ‘μΈμ€λ₯Ό μμ± ν λΆλͺ¨ νλ‘μΈμ€λ₯Ό μ’ λ£νλ μ΄μ μ λν΄ λͺ νν μ΄ν΄ν μ μλ€. λΆλͺ¨ νλ‘μΈμ€λ‘λΆν° μμ±λ μμ νλ‘μΈμ€λ μ’ λ£λ λ, λΆλͺ¨ νλ‘μΈμ€μκ² μ’ λ£λ μ¬μ€μ μ리며 λΆλͺ¨ νλ‘μΈμ€λ μ΄λ₯Ό νμΈν νμ κ΄λ ¨λ μνΈλ¦¬λ€μ μ 리νλ€.
μ¦, `fork()`λ₯Ό μ€ννλ νλ‘κ·Έλ¨μμ μμ νλ‘μΈμ€κ° μ’ λ£λ κ²½μ°μ λν μ²λ¦¬κ° νμνλ€. νμ§λ§ 리λ μ€μμλ κ³ μ νλ‘μΈμ€μ κ²½μ°, `init process`κ° λΆλͺ¨ νλ‘μΈμ€λ‘ λλλ‘ νμλ€. λ°λΌμ `init process`μμ μ£ΌκΈ°μ μΌλ‘ μμ νλ‘μΈμ€μ `exit`λ₯Ό μ²λ¦¬νκ² λλ―λ‘ μ’λΉ νλ‘μΈμ€λ‘ λ¨μ§ μκ³ , μ μμ μΌλ‘ μ’ λ£ν μ μλ€.
void create_process()
{
pid_t pid = fork();
/* νλ‘μΈμ€λ₯Ό μμ±νμ§ λͺ»ν κ²½μ° */
if (pid < 0)
exit(EXIT_FAILURE);
/* λΆλͺ¨ νλ‘μΈμ€μΈ κ²½μ° */
if (pid != 0)
wait(NULL);
}
μ¦, κ³ μλ‘ λΆλͺ¨ νλ‘μΈμ€λ₯Ό μ’ λ£μμΌ `init process`λ₯Ό λΆλͺ¨λ‘ λ§λ€μ§ μλλ€λ©΄ λΆλͺ¨ νλ‘μΈμ€λ μμμ `exit status` μνμ λ°λΌ μ²λ¦¬νκΈ° μν΄ `wait`λ₯Ό νμ¬μΌ νλ€. μ΄λ λΆλͺ¨ νλ‘μΈμ€λ₯Ό μν΄ λ³λλ‘ ν λΉλ 곡κ°μ΄ μ μ νκ³ μμΌλ―λ‘, `exit status`λ₯Ό μ²λ¦¬νκΈ° μν΄ μμμ μ μ νλ κ²μ λ€μ λΉν¨μ¨μ μ΄λ€.
'πββοΈ νλ‘κ·Έλλ° μΈμ΄ > C' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
C: Memory Layout of C Programs (0) | 2021.01.26 |
---|---|
C: Storage class specifier (0) | 2020.11.27 |
C: λμ ν λΉκ³Ό νμ© (0) | 2020.11.20 |
C: Generic Coding (0) | 2020.11.18 |
C: λ€μν ν¬μΈν° (0) | 2020.11.17 |