我正在开发一个客户端 - 服务器程序,当我尝试向另一个进程发送信号时,它只显示这句话"用户定义的信号1"。正如您在代码中看到的那样,我正在使用SIGUSR1
。
客户端:
void Exit(req req)
{
kill(req.server_pid, SIGUSR1);
fprintf(stdout,"\n[CLIENT] Closing the client...\n");
sleep(2);
unlink(FIFO_CLIENT);
exit(0);
}
服务器:
void ClientLeft (int sig)
{
fprintf(stdout,"\n[CLIENT] Just left the game!");
}
int main()
{
signal(SIGUSR1, ClientLeft);
}
我不明白为什么客户端没有运行剩余的线路,甚至服务器也没有显示printf。
答案 0 :(得分:4)
首先,您应该仔细阅读signal(7)。您将理解为什么您的代码违反规则(原则上您绝不应在信号处理程序中使用printf
或fprintf
。)
然后,您应该记住stdio是缓冲的。因此,在\n
格式字符串的 end 处添加printf
。或致电fflush(3)
有一个好习惯是始终使用printf
结束\n
格式字符串,如果您不这样做,请在适当的地方致电fflush(NULL)
地方。
此外,在客户端和服务器代码上使用strace(1)来检查SIGUSR1
信号是否确实已发送和处理。
您的main
功能(在服务器端显示)太短。在有机会获得任何信号之前,运行main
的过程很可能正在退出。在我的计算机上,您的服务器程序"在不到一毫秒的时间内运行。
最后,使用信号很可能是服务器和客户端之间通信的坏方法。