用户定义信号 1

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。

Bas*_*tch 6

您应该仔细阅读signal(7)signal-safety(7) ...

你会明白为什么你的代码违反了规则(原则上你不应该使用printffprintf在信号处理程序中,另见关于从 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.