fork 관련 질문입니다. 아래소스를 봐주십시오.

익명 사용자의 이미지

#include
#include
#include
#include
#include
#include

void mysig(int signo);
int main( int argc , char *argv[] )
{
pid_t pid, cpid;
static struct sigaction act;

fprintf( stderr , "Parent %d....start!\n" , getpid() );
act.sa_handler = mysig;
sigaction(SIGALRM , &act , 0);
sigaction(SIGINT , &act , 0);
sigaction(SIGCHLD , &act , 0);
sigaction(SIGCLD , &act , 0);
sigaction(SIGTSTP , &act , 0);
alarm ( 1 );
pid = fork();
if ( pid == 0 ) /* Child */
{
fprintf( stderr , "Child %d....start!\n" , getpid() );
sleep( 10 );
}
else if ( pid > 0 ) /* Parent */
{
cpid = wait(0);
fprintf( stderr , "I'm Parent %d....My Child[%d] is dead
Now.\n" , getpid(), cpid );
}
else
{
perror("fork fail");
}
return 0;
}

void mysig(int signo)
{
fprintf( stderr , "PID[%d] received signal %
d\n" , getpid() , signo );
}

와 같이 했는데 실행하면
Parent 20681....start!
Child 20682....start!
PID[20681] received signal 14
I'm Parent 20681....My Child[-1] is dead Now.

와 같이 나오고 죽습니다. 거의 바로 죽는데....
자식프로세스에서 10초가 sleep하도록 했는데
I'm Parent 20681....My Child[-1] is dead Now.
이메시지가 거의 바로 떨어지는 이유는 뭔지요?
제생각에는 자식이 10초간 있다간 잠에서 깨어나면
기다리고 있던 부모가(wait(0)) 그때 죽는것으로 예상했거든요...

익명 사용자의 이미지

익명 사용자의 이미지

alarm 시그널이 시그널핸들러(mysig)에서 잡혀서 처리돼고 있는데요
alarm시그널이 프로세스를 죽이나요

익명 사용자의 이미지

wait() 함수의 리턴값이 -1 이면 정상적으로 수행되지 않았다는 소리거덩
여...
errno 를 찍어보니까 EINTR이 나네여...

출력메시지 중에 보면 signal 14번 있자나여.. SIGALRM인가여?
그거 발생하면서 wait() 함수가 EINTR을 내면서 실패한거져...

음... wait()나 read() 뭐 이런 종류의 시스템콜을 아마 slow(?) system
call인가 비슷한 용어로 부를꺼예여... 즉 시스템콜 수행시 임의의 긴 시
간이 걸리는거져.... 이랬을 때 signal이 발생하는 것과 같은 외부상황이
발생하면 EINTR을 내면서 현재 연산을 실패내거덩여...
아마 넷웍 프로그램쪽을 해 보셨으면 accept() 를 호출했을 때 실패하면
errno 값을 비교해봐서 EINTR이면 다시 accept()를 불러주셨던 기억이 있
으실겁니다.
slow 시스템콜 수행시 다른 이벤트가 발생했어도 수행을 계속하도록 기본
동작을 바꿀 수가 있거덩여... 관련 서적을 참고해 보시구여.. (아마 스티
븐스 책에 나와있을꺼 같은데여...)

님 같은 경우에는 wait() 부르신 후에 리턴값 검사해서 -1 이면
errno 검사해서 EINTR이면 다시 wait() 부르심 될겁니다.

현재에는 alarm(1) 에서 설정해 놓은 알람이 expire되면서 14번 시그널이
발생했고, 이것때문에 wait()가 EINTR을 내면서 실패를 낸 것입니다.

수고여,,

익명 사용자의 이미지


man waitpid해보니깐
wait는 다음 3가지 경우에 대해 수행을 중단하는군요.
1.자식이 죽을 때까지 중단.
2.프로세스를 terminate시키는 시그널을 받을때까지 중단.
3.발생한 시그널이 (구현된)시그널핸들러에 의해 잡힐때까지 중단.

익명 사용자의 이미지

흠... SIGCHLD 가 발생한 것은 자식 프로세스가 죽었을때 발생하는
시그널입니다.
본래 wait(0) 이것을 이 SIGCHILD에 두거나
아니면 그 Signal을 가로챌 필요는 없습니다.
ALRM또한 중대한 시점 요소가 작용되네요.

차라리 wait(0)를 사용치 마시고
자식 프로세스의 첫부분에 setsid() 를 한번 호출하세요.
그럼 해결됩니다. 본래 그게 더욱 명확한 작동이 될것입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.