[英]User defined signal 1
我正在開發一個客戶端 - 服務器程序,當我嘗試向另一個進程發送信號時,它只顯示這句話“用戶定義的信號 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。
您將了解您的代碼為何違反規則(原則上您不應在信號處理程序中使用printf
或fprintf
,另請參閱有關從 Unix 信號調用 Qt 函數的說明)。
然后,您應該記住stdio(3)是緩沖的。 因此,在printf
格式字符串的末尾添加一個\\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)和其他系統調用(2) 。 另請閱讀 高級 Linux 編程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.