用户定义信号1

时间:2014-09-04 10:46:37

标签: c linux unix 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);
}

服务器:

void ClientLeft (int sig)
{
    fprintf(stdout,"\n[CLIENT] Just left the game!");
}

int main()
{
    signal(SIGUSR1, ClientLeft);
}

我不明白为什么客户端没有运行剩余的线路,甚至服务器也没有显示printf。

1 个答案:

答案 0 :(得分:4)

首先,您应该仔细阅读signal(7)。您将理解为什么您的代码违反规则(原则上您绝不应在信号处理程序中使用printffprintf。)

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

有一个好习惯是始终使用printf结束\n格式字符串,如果您不这样做,请在适当的地方致电fflush(NULL) 地方。

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

您的main功能(在服务器端显示)太短。在有机会获得任何信号之前,运行main的过程很可能正在退出。在我的计算机上,您的服务器程序"在不到一毫秒的时间内运行。

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