우분투 환경에서 C언어 시그널 질문 있습니다.
글쓴이: mjso9805 / 작성시간: 일, 2020/11/22 - 11:38오후
이제 막 시그널 공부 중인 학생입니다.
시그널 SIGUSR1을 받으면
그 부모 프로그램에서 만든 현재 진행 중인 자식 프로세서에게 SIGSUSR1을 보낸 후,
다음 시그널까지 대기 상태로 만드려고 합니다.
signal(SIGUSR1,handler) 으로 넘기고,
void handler(signo) 함수 안에는
if(signo==SIGUSR1)
kill(0,SIGUSR1);
을 넣었습니다.
위 명령을 사용했더니 자식 프로세서 말고 자기 자신에게도 SIGUSR1을 보내서 무한 루프가 발생해버리는데,
다른 방법이 없을까요? 혼자서 여러가지 시도해봤지만 계속 실패 중이라 도움이 필요합니다 ㅠ
Forums:
kill 함수에서 pid 값을 0 으로 설정하면 같은
kill 함수에서 pid 값을 0 으로 설정하면 같은 프로세스 그룹에 속한 모든 프로세스에게
신호가 전달되요. 부모와 자식 프로세스는 같은 프로세스 그룹에 속하므로 부모 프로세스에게도
전달되는거죠. kill( 자식 pid, SIGUSR1 ) 로 해보세요
그럼 자기 자신을 제외하고 보내려면 한 번에 자식
그럼 자기 자신을 제외하고 보내려면 한 번에 자식 프로세서 1개에만 보낼 수 있는 건가요?
자식 프로세서가 여러 개면 하나하나 따로 보내는 방법밖에 없나요?
sginal mask 기능을 이용하면 원하는 신호를
sginal mask 기능을 이용하면 원하는 신호를 ignore 할수있어요.
부모 프로세스에서 kill 신호를 보내기 전에 아래와 같이 설정하면
부모 프로세스에는 SIGUSR1 신호가 전달되지 않아요.
man page 를 잘 보아야 합니다. ( man kill, man sigprocmask )
pause() 함수를 호출하는게 좋지 않을까요?
다음 시그널까지 대기 상태로 만드려면 pause() 함수를 호출하는게 좋지 않을까요?
그리고, kill 명령어로 pid 값에 따른 동작을 정리하면 다음과 같으니 참고하시면 좋을 것 같습니다.
kill -9 [pid]: pid에 해당하는 프로세스를 종료
kill -9 -2: PID가 2인 프로세스가 속한 프로세스 그룹 내 모든 프로세스를 종료
kill -9 -1: 해당 프로세스 외의 모든 프로세스에 대해 종료 요청
혹시 시그널을 전달할 때 커널 내부의 동작을 파악하시려면 아래 소스를 분석하시면 됩니다.
https://elixir.bootlin.com/linux/v4.19.30/source/kernel/signal.c
static int kill_something_info(int sig, struct siginfo *info, pid_t pid)
(개인블로그)
http://rousalome.egloos.com
감사합니다 선생님
pause() 추가하니 바로 성공했습니다 감사합니당
댓글 달기