【发布时间】:2016-05-28 09:36:00
【问题描述】:
我想模拟一个游戏服务器,它应该不断地与其父级发送和接收信号。场景如下:
- 家长向游戏发送信号。
- 游戏捕捉到信号并向父级发送信号。
- 家长捕捉到信号并再次向游戏发送信号。
等等……
问题是第一圈后停止接收或发送:
static int game_s;
void game()
{
printf("game\n");
signal(SIGUSR1,game);
sleep(1);
kill(getppid(),SIGUSR1);
pause();
}
void parent()
{
printf("parent\n");
signal(SIGUSR1,parent);
sleep(1);
kill(game_s,SIGUSR1);
pause();
}
void main()
{
game_s = fork();
if(game_s>0)
{
signal(SIGUSR1,parent);
sleep(1);
kill(game_s,SIGUSR1);
pause();
}
else
{
signal(SIGUSR1,game);
pause();
}
}
输出如下:
game
parent
为什么停在这里?游戏服务器不应该捕捉到父母的信号并再次打印“游戏”吗......
【问题讨论】:
-
不是孩子在给孩子发信号,而父母不是在给自己发信号,也就是代码中的父母。在这种情况下,我通常会引入信号量和两种类型。 1个让父母等待,1个让孩子等待,2个while循环
-
信号是实现 IPC 的主要错误选择。还有其他方式:SHM、管道、套接字、MQ
-
孩子没有自己发信号,它发送 SIGUSR1 到 game_s 存储创建的孩子的 pid...不是吗?