본문 바로가기

Programming/Linux

자식프로세스 생성 - fork()


제가 공부한 내용을 정리한 내용이라 설명이 부실하고 혹은 올바르지 않은 부분도 있을 수 있습니다.


리눅스에서 fork함수를 사용하면 현재 프로세스의 자식 프로세스를 만들 수 있습니다. fork함수는 unistd.h라는 헤더에 선언되어 있습니다. 부모프로세스에서 fork함수를 호출하여 자식 프로세스를 만들면 자식 프로세스는 부모프로세스와 완벽히 똑같은 프로세스가 생성됩니다. 다만 하나, fork리턴 값이 0으로 설정된다는 차이점이 있습니다. 이 리턴값으로 부모인지 자식인지를 구분할 수 있습니다. 부모에서 fork를 호출하면 리턴값으로 자식의 pid가 리턴됩니다. 즉, 0이 리턴이 됐다면 자식 프로세스인 것이고 그 외의 값이 리턴됐다면 부모 프로세스 인 것입니다. 다만 -1이 리턴된다면 이는 자식 프로세스 생성에 실패했다는 것을 의미합니다.

예제를 하나 보겠습니다. 

부모 프로세스와 자식 프로세스에서 각각 카운트를 하는 프로그램입니다. 여기서는 깜빡 하고 리턴값이 -1일 때의 처리를 해 주지 않았는데 실제로 짤 때에는 꼭 해 주셔야 합니다. 이 소스를 실행시켜 보면 

이렇게 실행이 됩니다. 정상적으로 카운트를 잘 하고 있습니다. 두 프로세스는 독립적인 프로세스이기 때문에 각 카운트 값은 서로의 값에 전혀 영향을 끼치지 않습니다. 

이 두 프로세스간에 통신을 하려면 여러가지 방법이 있습니다. 나열해 보면 

Shared memory
Semaphores
Pipes
Signals
Memory-mapped files
Sockets

이렇게 있습니다. 여기서 주로 저는 pipe를 사용합니다. 


참고자료

http://forum.falinux.com/zbxe/index.php?document_srl=412814&mid=C_LIB
http://stackoverflow.com/questions/2849147/communicating-between-a-parent-and-its-children

'Programming > Linux' 카테고리의 다른 글

프로세스 끼리의 통신 - pipe()  (0) 2016.01.10