프로그램

linux c 에서 Daemon 올릴때, shell 쓰자.

(주)CKBcorp., 2015. 6. 17. 06:00
반응형



말 그대로.

보통 linux 에서 console command 를 실행하기 위해서 ( = 프로그램에서 다른 프로그램 실행 ) 사용하는게

fork() + exec() 계열 함수 혹은

fork() + system() 함수다.


근데, 나는 무슨 정신으로 이렇게 했는지 모르겠는데, 예전에 짜 놓은 코드를 보니 

fork() 도 안 쓰고, popen() 썼더라.


daemon 을 하나 올릴 일이 있어서 예전 작업 코드를 보다가

"어? 이거 왜 popen() 썼지?" 라고 생각하고 exec() 나 system() 으로 고치려고... -_-;;; 작업해 봤는데, 

왜 popen() 썼는지 알겠더라.


exec() 계열 함수나 system() 은 사용하기는 편한데, 

가장 큰 단점이, 프로그램 kill 이 잘 안된다는 거다.


설명하기 좀 애매한데( = 귀찮 )

코드 중간에 fork() + exec() 혹은 system() 을 했을 경우, 

아무리 새 process 가 생겼다고 해도 이 놈들은 parent process 랑 같이 논다. 나 자신이 돌아가는 원리를 잘 몰라서 저런 표현밖에 안되는데, 새로 생성된 별개의 프로세스가 아니라 parent process 에 예속된다. 

그래서 child process kill 을 해도 금방 안 죽고 ( 상태값 이름을 모르겠는데, defunct인가? 하여튼 동작은 안해도 죽지는 않는다. )  심지어 parent process 를 죽이면 멀쩡한 child 도 같이 죽어버린다.



근데, popen() 으로 명령행을 실행하면 괜찮다. 

아니, 정확하게 말하면 parent 죽으면 child 도 같이 죽지만, 이건 shell 만들어서 실행하면 해결되니까.



그러므로, Daemon 만들 때는 popen() + shell 로 실행하자. 그래야 테스트 다 하고 정작 daemon은 안 띄워놓는 바보짓은 면할 수 있다.









 


반응형