2010-11-21 91 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