【发布时间】:2011-05-13 06:38:57
【问题描述】:
我目前正在使用 Linux TCP/IP 服务器。服务器程序在 C 中运行。我目前正在对其进行测试,但是每次使用 Ctrl-c 退出它时,它使用的端口都没有释放,它正在写入的数据库也没有解锁。如何定义接收到 Ctrl+C 信号时退出的子程序?
【问题讨论】:
-
ctrl+z 不会结束进程,它只是暂停它。
我目前正在使用 Linux TCP/IP 服务器。服务器程序在 C 中运行。我目前正在对其进行测试,但是每次使用 Ctrl-c 退出它时,它使用的端口都没有释放,它正在写入的数据库也没有解锁。如何定义接收到 Ctrl+C 信号时退出的子程序?
【问题讨论】:
两种选择:
正如 R 所指出的,sigaction 比 signal 更便携,但对于 Linux 来说可能不那么惯用。
警告:如果您的程序被 SIGKILL (Ctrl+/) 杀死或收到任何其他未处理的信号,则 atexit 例程将不会运行。
【讨论】:
atexit。当进程死于未处理的信号时,使用atexit 注册的函数将不会运行。
sighandler_t 不是标准类型,sigaction 是一种比signal 更便携的方式来安装信号处理程序。 (POSIX 允许signal 的行为变化很大,并且在基于 SysV 的系统上,它的行为往往非常非常糟糕)。
@Bortds 一般不会立即释放端口,需要等待一段时间。我从我工作的一个服务器项目中找到了这个。
【讨论】:
查找setsockopt 和SO_REUSEADDR。必须在旧的原始服务器进程的套接字上设置此选项,否则新的将无法绑定端口,直到TIME_WAIT 期限到期。
【讨论】: