gpt4 book ai didi

c - 用户定义信号 1

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:19 26 4
gpt4 key购买 nike

我正在开发一个客户端-服务器程序,当我试图向另一个进程发送信号时,它只显示这句话“用户定义的信号 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。

最佳答案

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

您将理解为什么您的代码违反规则(原则上您永远不应在信号处理程序中使用 printffprintf,另请参阅有关 calling Qt functions from Unix signals 的解释)。

然后,你应该记住stdio(3)被缓冲。因此,在 printf 格式字符串的 end 添加一个 \n。或调用fflush(3)setvbuf(3) .

要养成的好习惯是始终以 \n 结束 printf 格式字符串,如果不这样做,请调用 fflush(NULL)适当的 地方。

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

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

最后,使用信号很可能是服务器和客户端之间通信的一种糟糕方式。考虑使用 pipe(7) , fifo(7) , unix(7) , socket(7) , eventfd(2) , poll(2) , read(2) , write(2)及其他syscalls(2) .另请阅读 Advanced Linux Programming

如果您使用最近的 GCC编译器,确保启用所有警告和调试信息,所以先编译 with gcc -Wall -Wextra -g

关于c - 用户定义信号 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25663492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com