말 그대로.
보통 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은 안 띄워놓는 바보짓은 면할 수 있다.
'프로그램' 카테고리의 다른 글
Visual Studio 에서 “LoaderLock was detected” 어쩌구 저쩌구 에러 (0) | 2015.06.25 |
---|---|
MicroSoft Visual Studio - 라이센스 문제없는 버전. (0) | 2015.06.23 |
한국 타임서버 - 표준시 얻을 때 사용. (0) | 2015.06.13 |
grep 사용법 (0) | 2015.06.11 |
cafe24 서버 + 웹서비스 설정 처음에 할 일 (1) | 2015.06.09 |