Mar*_*rco 1 c unix linux ubuntu
我正在开发一个客户端-服务器程序,当我尝试向另一个进程发送信号时,它只显示这句话“用户定义的信号 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);
}
Run Code Online (Sandbox Code Playgroud)
服务器:
void ClientLeft (int sig)
{
fprintf(stdout,"\n[CLIENT] Just left the game!");
}
int main()
{
signal(SIGUSR1, ClientLeft);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么客户端不运行其余的行,甚至服务器也不显示 printf。
你会明白为什么你的代码违反了规则(原则上你不应该使用printf或fprintf在信号处理程序中,另见关于从 Unix 信号调用 Qt 函数的解释)。
然后,您应该记住stdio(3)是缓冲的。因此,添加\n在结束您的printf格式字符串。或者调用fflush(3)或setvbuf(3)。
最好的习惯是始终以printf格式字符串结尾\n,如果不这样做,请fflush(NULL)在适当的地方调用。
此外,在客户端和服务器代码上使用strace(1)来检查SIGUSR1信号是否确实已发送和处理。
您的main函数(如您在服务器端显示的那样)太短了。运行您的进程main很可能在有机会获得任何信号之前退出。在我的计算机上,您的“服务器程序”运行时间不到一毫秒。
最后,使用信号很可能是在服务器和客户端之间进行通信的一种糟糕方式。考虑使用pipe(7)、fifo(7)、unix(7)、socket(7)、eventfd(2)、poll(2)、read(2)、write(2)和其他系统调用(2)。另请阅读高级 Linux 编程
如果您使用最新的GCC编译器,请确保启用所有警告和调试信息,因此首先使用 gcc -Wall -Wextra -g.
| 归档时间: |
|
| 查看次数: |
14710 次 |
| 最近记录: |