시그널 처리 질문드립니다
안녕하세요 며칠전 선배님들의 도움으로 하나의 관문을 통과하였는데
또 다시 난관에 부딫히게된 초보입니다ㅠㅠ
질문 드리겠습니다
먼저 현재 수행중인 과제조건은 clone, kill, signal관련 함수로만 쓰레드를 관리해야 한다입니다.
1. 제가 시그널을 이해한 바로는
1) 시그널은 모든 쓰레드에 전달된다.
2) 시그널 함수가 호출되면 그 시그널은 해제된다 입니다.
제가 main문에서 signal(SIGCHLD, SIG_IGN);
를 작성한 후
자식 프로세스 2개를 생성하고 그 두 자식프로세스를 종료(SIGSTOP or SIGKILL)하는 상황을 만들 때
위 조건을 통하면 먼저 처음 자식이 종료될 때는 sig_ign으로 자식이 종료된 시그널을 무시하고
이 때 signal은 해제되어 다음 자식이 종료되면 시그널이 main에 도착한다고 생각하였는데 이게 맞나요..?
2. 정지중인 쓰레드에 시그널을 걸고 해당 시그널이 도착하면 본인을 깨울 수 없는건가요??
void sig_handle(int signo){ // 본인을 살리겠다 kill(getpid(), SIGCONT); } // process1이 실행하는 함수 void process1(){ signal(SIGCHLD, sig_handle); // process2 생성 clone process2 // 본인을 정지 kill(getpid(), SIGSTOP); } //process2가 실행하는 함수 void process2(){ ,,, // 종료하면 부모에게 SIGCHLD 시그널 전송 exit(0); }
위의 코드처럼 process1이 자식을 생성하고 시그널 등록 후 본인을 정지한 상태에서
생성된 자식이 부모에게 시그널을 보내면 전달 받을 수 있다고 생각하였습니다.
하지만 도착하지 않아서 난관에 봉착했습니다ㅠㅠ
위와같은 코드를 작성한 이유는 pthread_wait함수와 같은 기능을 하는 함수를 만드려고 하고 있습니다.
부모는 특정자식을 기다리고 특정자식이 종료되면 다시 실행되는 코드를 만들고 싶은데
다른 방법이 떠오르지가 않습니다ㅠ
3. 2번을 고민하다 sigset이란걸 찾았는데 sigset은 set에 설정된 시그널이 발생할 때까지 동기적으로
기다린다고 하는데 동기적으로 기다린다면 SIGSTOP상태가 아니어서 멀티쓰레드 환경에서
다른 쓰레드가 온전히 본인의 시간을 사용할 수 없는 문제가 있지 않나요?
리눅스에 발을 들인지 얼마 안돼서 질문의 수준이나 말이 안되는것이 있을 수 있습니다ㅠ
너그럽게 용서하시고 다시 물어봐 주신다면 최대한 제 상황을 설명해보겠습니다.
저랑 같은 과제 하시는거같네요 ㅎㅎ.. 저도 그 문제
저랑 같은 과제 하시는거같네요 ㅎㅎ.. 저도 그 문제 때문에 고민중입니다..
운영체제 과제같으신데..
음 ..
SIG_IGN, SIG_DFL 은 영구적으로 적용됩니다.
SIGSTOP 은 suspend 시키는 signal 입니다.
SIGCONT 로만 깨울 수 있고, 그 전까지 발생한 이벤트들은 말 그대로 suspend 됩니다.
따라서, 누군가가 SIGCONT 를 날려줘야 SIGCHLD 를 처리할 수 있을겁니다.
clone() 으로 생성한 child 의 종료를 처리하려면..
waitpid() 만으로도 될 것 같은데.. 하고 싶으신게 뭔지 모르겠네요..
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기