2013-08-05 7 views
0

시험에 대한 연습 문제를하고 있는데 질문 중 하나에 parent.c 및 child.c라는 두 가지 코드가 있습니다. 부모는 자식을 만들고 신호를 발생시키고 자식은 신호를받을 때마다 메시지를 표시합니다. 어린이는 나머지 시간을 메인에서 보내는 메시지를 보내는 시간입니다. 문제는 child.c에서 신호 처리가 잘못된 점을 설명하고이를 수정하기 위해 코드를 다시 작성하는 것입니다. 나는 신호에 대한 일반적인 생각을 가지지 만 그것들을 구현하는데 많은 어려움을 겪는다. child.c의 procmask이 제대로 작동하는지 확신 할 수 없지만 신호가 전혀 마음에 들지는 않지만 왜 마지막 값으로 NULL을 입력했는지 알 수 없습니다. 왜 그 부분이 잘못된 것일까 요? 누군가 올바른 방향으로 나를 가리켜 주시고 코드의 어떤 부분이 왜이며 왜 그런지에 대한 아이디어를 주시겠습니까?부모 프로세스가 자식 프로세스에서 신호를 보내지 만 자식의 신호 처리를 향상시켜야합니다.

Parent.c

#include <unistd.h> 
#include <signal.h> 
int 
main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    sigset_t set; 

    sigemptyset(&set); 

    sigaddset(&set, SIGUSR1); 

    sigprocmask(SIG_BLOCK, &set, NULL); 

    pid = fork(); 

    if (pid == 0) { 
     execlp("./child", "./child", NULL); 
    } 

    while (1) { 
     kill(pid, SIGUSR1); 
    } 

    return (0); 
} 

Child.c

#define _XOPEN_SOURCE 500 

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h> 

static void 
handler(int signo) 
{ 
    printf("This is the SIGUSR1 signal handler!\n"); 
} 

int 
main(void) 
{ 
    sigset_t set; 

    sigemptyset(&set); 

    sigset(SIGUSR1, handler); 

    sigprocmask(SIG_SETMASK, &set, NULL); 

    while (1) { 
     printf("This is main()!\n"); 
    } 

    return (0); 
} 
+0

자녀의'sigprocmask'에 * 뭔가 잘못되었습니다. 더 이상 말하면 모든 것을 버릴 것입니다. 자녀 과정에서 무엇을하려고하는지 설명해 주시겠습니까? 당신이 그것을 이해한다면 왜 잘못되었는지 보는 것은 그렇게 어렵지 않아야합니다. –

답변

0
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 

마지막 파라미터는 이전 신호 마스크를 저장하는데 사용된다. NULL 일 때 이전 신호 마스크를 저장할 필요가 없음을 의미합니다. NULL0로 정의 될 수 있기 때문에 당신이 재진입 아니기 때문에, How to avoid using printf in a signal handler?

그리고 execlp의 사용을 참조 신호 처리기에서 printf을 사용해서는 안

참고 잘못이며, 컴파일러는 그것의 생각 null 포인터가 아닌 정수. sigset가 사용되지 않습니다

execlp("./child", (char *)0); 
+0

의견을 주셔서 감사합니다! 특히 sigprocmask 매개 변수에 대해 설명합니다. 질문은 단지 우리가 Child.c를 Parent.c가 아닌 것으로 변경하기를 원하기 때문에 강사가 찾고 있다고 생각하지는 않습니다. execlp 라인을 고치는 것입니다. – user1786327

0

man sigset으로 주와 당신은 sigaction을 사용해야합니다

execlp("./child", "./child", NULL); 

마지막 매개 변수는이 같은 (char *)0이어야한다. Here은 사용 방법에 대한 예입니다.