시그널 처리 질문드립니다

kysu5095의 이미지

안녕하세요 며칠전 선배님들의 도움으로 하나의 관문을 통과하였는데
또 다시 난관에 부딫히게된 초보입니다ㅠㅠ

질문 드리겠습니다
먼저 현재 수행중인 과제조건은 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상태가 아니어서 멀티쓰레드 환경에서
다른 쓰레드가 온전히 본인의 시간을 사용할 수 없는 문제가 있지 않나요?

리눅스에 발을 들인지 얼마 안돼서 질문의 수준이나 말이 안되는것이 있을 수 있습니다ㅠ
너그럽게 용서하시고 다시 물어봐 주신다면 최대한 제 상황을 설명해보겠습니다.

isvara의 이미지

저랑 같은 과제 하시는거같네요 ㅎㅎ.. 저도 그 문제 때문에 고민중입니다..
운영체제 과제같으신데..

ymir의 이미지

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 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.