2016-05-04 51 views
1

我正在学习有关signal(),我有这两个文件:信号并杀死ç

server.c:

void handler_sigcont(){ 
    printf("SIGCONT server\n"); 
} 

int main(){ 
    signal(SIGCONT,handler_sigcont); 
    printf("%d\n",getpid()); 
    kill(getpid(),SIGSTOP); 
    printf("server!\n"); 
} 

client.c:

int main(int argc, char** argv){ 
    kill(atoi(argv[1]),SIGCONT); 
    printf("client!\n"); 
} 

首先我执行服务器。 c,这是输出:

6999 

[7]+ Stopped     ./sobusrv 

然后,我执行client.c这样的:

./client 6999 

要唤醒过程6999 输出是以下之一:

client! 
SIGCONT server 
server! 
[8] Done     ./sobusrv 

但是,如果,在server.c,我改变signal()kill()后,像这样:

void handler_sigcont(){ 
    printf("SIGCONT server\n"); 
} 

int main(){ 

    printf("%d\n",getpid()); 
    kill(getpid(),SIGSTOP); 
    printf("server!\n"); 
    signal(SIGCONT,handler_sigcont); 
} 

我得到这样的输出:

client! 
server! 
[8] Done     ./sobusrv 

我想知道为什么在kill()之后写signal()时避免使用处理程序。

+1

您已停止的过程,因此不会执行'signal'电话。 – kaylum

回答

2

当你的服务器上的呼叫写在kill()之后时,这意味着信号处理程序在服务器收到SIGCONT之后才会被安装。这是因为服务器中的kill()调用立即生效以暂停服务器进程。

在服务器收到SIGCONT时,将使用默认处理程序,因为尚未安装其他处理程序。

1

这是不可避免的,但操作的顺序是不同的。在注册处理程序之前,您的服务器会收到STOP信号。当它发送SIGCONT时,它会继续,然后注册处理程序并退出而不会收到另一个信号。对于处理程序注册之前发生的信号,处理程序不会执行。

1

你可以用加薪(SIGCONT)函数是这样的:

void handler_sigcont(int sig){ 
    printf("SIGCONT server\n"); 
} 

int main(){ 
    signal(SIGCONT,handler_sigcont); 
    printf("%d\n",getpid()); 
    raise(SIGCONT); 
    printf("server!\n"); 
}