2010-11-21 73 views
1

我目前正在使用Linux TCP/IP服務器。服務器程序使用C語言運行。我目前正在測試它,但每次使用Ctrl-c退出時,它所使用的端口都不會被釋放,也不會釋放它正在寫入的數據庫以解鎖。如何定義在接收到Ctrl + C信號時將退出的子程序?在C編寫的Linux TCP/IP服務器中處理Ctrl-C

+0

你試過用CTRL + Z嗎? – 2010-11-21 02:44:04

+2

ctrl + z不結束進程,它只是暫停它。 – jtdubs 2010-11-21 02:51:24

回答

1

兩個選項:

  1. 與添加一個清除例程:int atexit(void (*function)(void));
  2. 鉤按Ctrl + C具有:sighandler_t signal(int signum, sighandler_t handler);

作爲R指出,sigactionsignal更便攜,但也許Linux的習慣較少。

警告:如果程序用SIGKILL(Ctrl + /)或任何其他未處理的信號收到而終止程序,atexit例程將不會運行。

+0

我不認爲這是問題。 – 2010-11-21 02:48:34

+1

關於套接字問題,我同意你的答案。與數據庫連接,但是... – jtdubs 2010-11-21 02:49:52

+0

啊,我懶得看問題的後半部分。我同意數據庫。它是一個需要的信號處理程序,而不是'atexit'。當進程死於未處理的信號時,使用'atexit'註冊的函數將不會運行。 – 2010-11-21 02:52:44

1

查找setsockoptSO_REUSEADDR。該選項必須在舊的原始服務器進程的套接字上設置,否則在TIME_WAIT期限到期之前,新的套接字將無法綁定端口。

1

@Bortds通常情況下,端口不會立即釋放,您必須等待一段時間。我從我工作的一個服務器項目中找到了這個。

+0

@everybody看來R ..的答案是我的答案的超集。 – prabhakaran 2011-12-22 07:46:44