簡體   English   中英

用戶定義信號 1

[英]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。

您應該仔細閱讀signal(7)signal-safety(7) ...

您將了解您的代碼為何違反規則(原則上您不應在信號處理程序中使用printffprintf ,另請參閱有關從 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 編程

如果您使用最新的GCC編譯器,請確保啟用所有警告和調試信息,因此首先使用gcc -Wall -Wextra -g編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM