다른 프로세스로 신호를 어떻게 보낼 수 있을까요?
글쓴이: bergamot / 작성시간: 월, 2004/03/01 - 1:22오전
제가 임베디드 시스템으로 프로그램을 하나 짜고 있는데요
중간에 system 명령으로 보조 프로그램을 실행합니다
문제는 주 프로그램이 계속 도는 동안에 실행된 보조 프로그램이 끝날 경우
실행이 끝났다는 사실을 주 프로그램이 인식해야 하거든요?
이걸 해결할 방법이 어떤게 있을까요?
간단하게 방향이라도 잡아주신다면 열심히 찾아서 해보겠습니다 ^^
초보다 보니 어떤게 있는지 몰라서 일단 방향 잡기도 쉽지 않군요
감사드립니다~
Forums:
잘 기억은 나지 않지만 예전에 이와 비슷한 주제를 읽은 적이 있는 것 같
잘 기억은 나지 않지만 예전에 이와 비슷한 주제를 읽은 적이 있는 것 같네요..
여러가지 방법 중에서 가물가물 기억 나는 것은 파일을 이용하는 것입니다.
보조프로그램이 실행되면 파일을 만듭니다. 그리고 주프로그램에서는 파일의 존재 여부를 주기적으로 검사합니다. 그리고 보조프로그램은 자신이 만들었던 파일을 지우고 종료합니다.
이렇게 하면 주프로그램이 보조프로그램의 실행.종료 여부를 알 수 있지 않을까요... 확실한 답변을 못 드려서 죄송합니다 ^^;;
인생, 쉬운 것만은 아니네..
Re: 다른 프로세스로 신호를 어떻게 보낼 수 있을까요?
man popen ;)
껍질의 파괴
보조프로그램이 종료되었음을 즉각 알기 위해서는 PIPE나 FIFO를 이용
보조프로그램이 종료되었음을 즉각 알기 위해서는 PIPE나 FIFO를 이용하시고
주기적으로 체크하시려면 시스템콜 ps를 실행시키시면 됩니다.
PIPE나 FIFO는 바로 통신이 가능하므로 보조프로그램에서 주프로그램으로
종료가 됨을 바로 알려주고 종료하시면 되고
주기적으로 체크하실 경우는.
system("ps -ef | grep 보조실행파일이름 > .temp_log");
하셔서 .temp_log 파일사이즈가 0이면 보조프로그램이 종료된 것이고
파일사이즈가 0보다 크다면 실행중인 것으로 간주하시면 됩니다.
아지랑이류 초환상 공콤 화랑... 포기하다.. T.T
SIGCHLD 핸들러를 만드는게 답이겠죠?
SIGCHLD 핸들러를 만드는게 답이겠죠?
Re: 다른 프로세스로 신호를 어떻게 보낼 수 있을까요?
system 으로 명령을 내릴 때, "&"를 맨 뒤에 넣어 background job으로 했나보죠? 주프로그램과 보조 프로그램이 동시에 실행되는 것을 보니..
이런 경우에는 자동으로 발생하는 signal을 통해서는 알 수 없습니다.
다른 보조 메커니즘을 사용해야합니다. 파일을 만든다든지 아니면 인위적으로 parent의 pid를 argument 등으로 넘기고 signal을 던진다든지..
고민해보셔요.
---
http://coolengineer.com
제가 보기로는...
system 명령을 쓰는 걸보면 system으로 실행이 되는 어플리케이션이 다른 어플리케이션이라 그쪽에서 뭘보낸다거나 하는 일은 안될꺼라는 생각이 드네요...
waitpid라는 함수의 man page를 보시면 wait할 pid를 지정해서 해당 pid의 태스크가 종료하면 리턴이 됩니다.
기다리는걸 안하려면 time out 값을 NO_WAIT인가 하는 것으로 넣어주어 에러인지 (이미 종료) Timeout인지 (동작중) 파악할 수 있을 것 같습니다.
async하게 하기 위해서는 SIGCHILD가 관계가 있을 것 같은데 자세히는 모르겠네요. child가 종료하면 parent로 이 시그널을 보낸다고 알고 있는데...
그리고...
&를 넣어서 백 그라운드로 실행을 하더라도, 통상의 데몬들처럼 setsid 같은 것으로 새로 세션을 만들지 않으면 system을 실행시킨 task의 child가 되는게 아닌가요? child가 종료하면 항상 SIGCHLD를 parent에게 보내구요. 그 signal을 무시하고 말고는 parent에서 정하는 것이구요.
Re: 그리고...
다릅니다.. system 은 기본적으로 shell을 구동시킨다음 그 shell에서 명령을 parsing하고 다시 실행하기 때문에, system을 실행 한 쪽에서는 shell에 대한 것만 부모 자식관계로 파악합니다.
개다가 & 로 실행시킨다면, 아마 실험은 안해봤는데, orphan process로 될 것 같은데요..?
---
http://coolengineer.com
system()대신에 exec()류의 함수를 써야겠네요.execl
system()대신에 exec()류의 함수를 써야겠네요.
execl(), execv(), .... 대신 인수는 수동으로 집어 넣어야 합니다. 아 참 fork()도 추가
Written By the Black Knight of Destruction
움..
exec류를 쓰시고, signal 처리로 하시면 될것 같습니다..
세상은 넓고, 할 일은 많은데, 난 숨만 쉬고 있니?
socket 통신을 하는 것도 괜찮을 것 같네요tcp/ip 소켓도 좋
socket 통신을 하는 것도 괜찮을 것 같네요
tcp/ip 소켓도 좋겠지만 같은 로컬 서버에서 돌아가는게 불변이라면 좀 더 빠른 unix socket 도 좋을 듯 하네요.
다른 방법으로 공유메모리를 이용한 메시지큐 같은걸 구현해도 좋을 것 같네요.
여러가지 답변들 감사드립니다참조해서 공부해 보겠습니다^^
여러가지 답변들 감사드립니다
참조해서 공부해 보겠습니다
^^
댓글 달기