C 过程不';t在接收到用户定义的信号时取消暂停

C 过程不';t在接收到用户定义的信号时取消暂停,c,unix,signals,fork,pause,C,Unix,Signals,Fork,Pause,我试图让两个进程在C语言中协作。为此,我使用了pause()和用户信号,据我所知,pause()使程序休眠,直到收到信号为止。我正在这样做: pid_t child = fork(); if(child < 0) { perror("Fork error"); exit(1); } else if (child > 0) { //parent process //do something here, then: printf("Pare

我试图让两个进程在C语言中协作。为此,我使用了
pause()
和用户信号,据我所知,
pause()
使程序休眠,直到收到信号为止。我正在这样做:

pid_t child = fork();
if(child < 0) {
    perror("Fork error");
    exit(1);
}
    else if (child > 0) { //parent process
    //do something here, then:
        printf("Parent pausing\n"); 
        pause();
        printf("parent received sigusr2\n");    
        //do something
        kill(child, SIGUSR2);
        printf("Sent signal to child\n");   
        sleep(1);
        fflush(NULL);
        pause();
        kill(child,SIGTERM);                
        waitpid(child, &status, 0);
    }
    else { //child process
       //do something, then
       printf("Child sending sigusr2\n");
       kill(getppid(), SIGUSR2);
       printf("Child pausing\n");
       pause();
       //do something
       kill(getppid(), SIGUSR2);

       fflush(NULL);
       printf(frompipe);
       pause();             
}

它就停在那里,好像父进程没有收到信号一样(因为它没有打印父进程收到的sigusr2)。程序终止,但进程在后台卡住。我做错了什么

@Eugene Sh.是正确的:您需要一个信号处理函数。警察说

pause()仅在捕获信号并返回信号捕获函数时返回

为此,请将以下内容添加到您的程序中:

void sigusr2_handler(int) { /* do nothing*/ }
然后,在调用
fork()
之前,添加

struct sigaction sa;
sa.handler = sigusr2_handler;
sa.mask = 0;
sa.sa_flags = 0;
sigaction(SIGUSR2, sigusr2_handler);
使用
sigaction
意味着此处理程序将一直存在,直到您禁用它为止(与
signal(2)
不同)。将其置于
fork
调用之前会使其应用于父级和子级;说明:“通过
fork(2)
创建的子级继承其父级信号处理的副本。”

使用此代码,您的
pause()
调用将返回。如果您想在
sigusr2\u handler
中打印消息或执行其他操作,您当然可以这样做,但我读过的一般建议是让处理程序尽可能简单


(顺便说一句,我还会在每次
printf
之后添加
fflush
调用,以确保调试时的安全。我认为这不必要,但也不会有什么坏处!)

您有针对这些信号的信号处理程序吗?From
manpause
:pause()使调用进程(或线程)休眠,直到发送终止进程或调用信号捕获函数的信号。从同一手册页上看,
sigssuspend(2)
可能值得一看。我想
pause()
本身捕获了信号。。。是吗?
man
页面很清晰,不是吗?
struct sigaction sa;
sa.handler = sigusr2_handler;
sa.mask = 0;
sa.sa_flags = 0;
sigaction(SIGUSR2, sigusr2_handler);