在用C编写的Linux TCP / IP服务器中处理Ctrl-C

我目前正在研究Linux TCP / IP服务器。 服务器程序在C中运行。我正在测试它,但是每次我用Ctrl-c退出它时,它所使用的端口都没有被释放,它正在写入解锁的数据库。 如何定义在收到Ctrl + C信号时将退出的子程序?

查找setsockoptSO_REUSEADDR 。 必须在旧的原始服务器进程的套接字上设置此选项,否则在TIME_WAIT期限到期之前,新选项将无法绑定端口。

@Bortds一般来说,端口不会立即释放,你必须等待一段时间。 我从我工作的服务器项目中找到了这个。

两种选择:

  1. 添加一个清理例程: int atexit(void(* function)(void));
  2. 挂钩Ctrl + C with: sighandler_t signal(int signum,sighandler_t handler);

正如R指出的那样, sigaction比信号更便携,但对于Linux来说可能不那么惯用。

警告:如果使用SIGKILL(Ctrl + /)或任何其他未处理的信号终止程序,则不会运行atexit例程。