【问题标题】:Handling Ctrl-C in a Linux TCP/IP Server written in C在用 C 编写的 Linux TCP/IP 服务器中处理 Ctrl-C
【发布时间】:2011-05-13 06:38:57
【问题描述】:

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

【问题讨论】:

  • ctrl+z 不会结束进程,它只是暂停它。

标签: c linux tcp


【解决方案1】:

两种选择:

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

正如 R 所指出的,sigactionsignal 更便携,但对于 Linux 来说可能不那么惯用。

警告:如果您的程序被 SIGKILL (Ctrl+/) 杀死或收到任何其他未处理的信号,则 atexit 例程将不会运行。

【讨论】:

  • 我认为这不是问题。
  • 关于套接字问题,我同意你的回答。但是与数据库连接...
  • 啊,我懒得看问题的后半部分了。我同意数据库。它是一个需要的信号处理程序,而不是atexit。当进程死于未处理的信号时,使用atexit 注册的函数将不会运行。
  • 顺便说一下,sighandler_t 不是标准类型,sigaction 是一种比signal 更便携的方式来安装信号处理程序。 (POSIX 允许signal 的行为变化很大,并且在基于 SysV 的系统上,它的行为往往非常非常糟糕)。
  • 我同意你所说的一切。关于您的第一点,我在帖子中提到了 SIGKILL,但我本可以更清楚。我提到了信号而不是 sigaction,因为它在 Linux 上似乎更惯用,这是 OP 提到的操作系统。
【解决方案2】:

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

【讨论】:

  • @everybody 看来 R.. 的回答是我回答的超集。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2014-11-25
    • 2016-09-16
    • 2017-04-27
    • 2011-09-15
    • 2012-06-15
    相关资源
    最近更新 更多