2014-09-04 42 views
1

我正在开发客户端服务器程序,当我试图向其他进程发送信号时,它只显示“用户定义信号1”这个句子。正如你在代码中看到的那样,我正在使用SIGUSR1用户自定义信号1

客户:

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

'server'和'client'在同一个系统上运行? – 2014-09-04 10:49:28

+0

“用户定义信号1”从哪里来?具体来说,你确定函数“Exit”实际上是否被调用? – Odexios 2014-09-04 10:49:41

+0

@NatashaDutta是的。 – 2014-09-04 10:59:09

回答

4

首先,您应该仔细阅读​​。你会明白为什么你的代码违反规则(原则上你不应该在信号处理程序中使用printffprintf)。

然后,你应该记住stdio被缓冲了。因此,请在您的printf格式字符串的结尾处添加\n。或致电fflush(3)

的好习惯是到最后总是printf格式字符串与\n,如果你不这样做,在适当地方叫fflush(NULL)

此外,使用客户端和服务器代码上的strace(1)来检查确实发送和处理了SIGUSR1信号。

您的main函数(如您在服务器端显示的)太短。运行您的main的过程很可能在您有机会获取任何信号之前退出。在我的电脑上,您的“服务器程序”运行时间不到一毫秒。

最后,使用信号很可能是服务器和客户端之间通信的不好方法。

+1

“退出”仍应打印其消息;如果没有,我会打赌它并没有被实际称为;此外,即使'printf'不是异步安全的,所以它不应该被使用,它仍然应该在这个简单的代码中工作,没有太多问题。 – Odexios 2014-09-04 10:51:36

+0

@Basile Starynkevitch,我削减了主函数的所有代码行,并且我只留下了重要的代码行。我不知道是否是正确的方式发布堆栈溢出,但我是一个初学者,我不知道它不幸。 – 2014-09-04 10:58:47

+0

然后,错误的格式字符串可能会解释一些东西,请使用'strace' – 2014-09-04 11:00:03