fork

김새우·2022년 9월 21일
0

go

목록 보기
5/13

todo

  • 바이너리가 백그라운드에서 계속 실행되도록 daemon으로 개발해야함

how

  • 예를 들어 bash에서 파일을 run 하고 bash를 종료시키면 프로그램도 종료된다
    bash를 종료하더라도 백그라운드에서 계속 동작하게 하려면 프로세스를 제어하고 있는 터미널로부터 분리해야한다
    부모프로세스를 실행시키면 자식 프로세스를 fork하고 부모 프로세스는 exit 호출하여 종료시킨다.
    setsid()를 호출하여 프로세스를 프로세스그룹의 리더로 만든다
    umask를 0으로 변경하여 호출한 쪽의 umask와 상관없이 open(), create() 등의 호출을 수행할수 있도록 한다

상속받았으며, 부모프로세스가 열고 잇는 파일들을 자식 프로세스에서 모두 닫는다
0, 1,2 번 파일 서술자 포함

stdin, stdout, stderr 포함
로그파일이나 콘솔, 또는 /dev/null 을 stdin, stdout, stderr 로 설정한다.

golang에서는 fork systemcall을 직접 지원하지 않음
forkExec로 현재 프로세스를 새 프로세스로 대체하는 api 존재

Go가 고전 Unix의 fork를 제공하지 않는다는 사실을 기억하십시오. 보통 고루틴을 이용하여 프로세스를 생성하거나 exec하여 fork의 대부분의 use case를 다루기 때문에 웬만해선 문제가 되지 않을 것입니다.

syscall.Exec()

syscall.Exec() 함수는 내부적으로 exec family 시스템 콜인 execve(2) 를 실행한다. exec family 시스템 콜은 부모 프로세스에서 자식 프로세스를 fork하는 것이 아닌, 현재 프로세스의 메모리를 새로운 프로세스로 덮어 씌워버린다. 따라서 기존 프로세스의 PID를 똑같이 사용하게 되며, 부모-자식 프로세스라는 개념 자체가 존재하지 않는다.

약간 이해함
entry 프로세스가 daemon 프로세스를 만들고 return으로 죽음
entry(die) -> daemon(live)

daemon 프로세스가 다시 forkExec함
entry(die) -> daemon(live) -> child(live)

daemon 프로세스를 parent로 보고
signal 처리를 해줘야한다

부모가 아무이유없이 죽으면 -> child도 죽어야함
부모가 정상이어도 부모가 죽으라하면 child는 죽어야함

0개의 댓글