ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•
λ¦¬λˆ…μŠ€μ—μ„œ λ‚΄κ°€ μ›ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό ν• λ‹Ήν•˜κΈ° μœ„ν•΄, μœ μ € λ ˆλ²¨μ—μ„œ fork()λ₯Ό ν™œμš©ν•˜μ—¬ λ‚˜μ˜ μ‹€ν–‰ ν”„λ‘œκ·Έλž¨μ„ λΆ€λͺ¨λ‘œ ν•˜λŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 수 μžˆλ‹€. fork()κ°€ μ–΄λ–€ μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ μ •ν™•νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•œλ‹€λ©΄, μ›μΉ˜ μ•ŠλŠ” κ²°κ³Όλ₯Ό λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ μ •λ¦¬ν•΄λ³΄κ³ μž ν•œλ‹€.

 

fork μ‚΄νŽ΄λ³΄κΈ°

man 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`λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μžμ›μ„ μ μœ ν•˜λŠ” 것은 λ‹€μ†Œ λΉ„νš¨μœ¨μ μ΄λ‹€.

 

 

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€