Linux: signal: SIGALRM; alarm: ITIMER_REAL

Openssh使用alarm接口实现登陆超时警告的功能;这个接口的功能非常单一,有一个全局的变量来记录这个ITIMER_REAL;

https://www.man7.org/linux/man-pages/man2/alarm.2.html

https://www.man7.org/linux/man-pages/man2/setitimer.2.html

c 复制代码
	/*
	 * We don't want to listen forever unless the other side
	 * successfully authenticates itself.  So we set up an alarm which is
	 * cleared after successful authentication.  A limit of zero
	 * indicates no limit. Note that we don't set the alarm in debugging
	 * mode; it is just annoying to have the server exit just when you
	 * are about to discover the bug.
	 */
	ssh_signal(SIGALRM, grace_alarm_handler);
	if (!debug_flag)
		alarm(options.login_grace_time);

如果登陆失败,就清理alarm

c 复制代码
	/*
	 * Cancel the alarm we set to limit the time taken for
	 * authentication.
	 */
	alarm(0);

glibc的实现

c 复制代码
/* Schedule an alarm.  In SECONDS seconds, the process will get a SIGALRM.
   If SECONDS is zero, any currently scheduled alarm will be cancelled.
   The function returns the number of seconds remaining until the last
   alarm scheduled would have signaled, or zero if there wasn't one.
   There is no return value to indicate an error, but you can set `errno'
   to 0 and check its value after calling `alarm', and this might tell you.
   The signal may come late due to processor scheduling.  */
unsigned int
alarm (unsigned int seconds)
{
  struct itimerval old, new;
  unsigned int retval;

  new.it_interval.tv_usec = 0;
  new.it_interval.tv_sec = 0;
  new.it_value.tv_usec = 0;
  new.it_value.tv_sec = (long int) seconds;
  if (__setitimer (ITIMER_REAL, &new, &old) < 0)

详细的解释:ITIMER_REAL

https://www.man7.org/linux/man-pages/man2/setitimer.2.html

  1. alarm() 和 setitimer()
    级别: 进程级别 (Process-level)。
    它们设置的定时器是针对整个进程的。当定时器到期时,内核会向整个进程发送相应的信号(SIGALRM, SIGVTALRM, SIGPROF)。
    如果进程是多线程的,这些信号会发送给进程中的任意一个线程(通常是主线程,除非有特定的信号处理配置)。
    数量: 每个进程只有一个。
    alarm() 只能设置一个实时定时器,新的 alarm() 调用会覆盖旧的。
    setitimer() 有三种类型 (ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF),每种类型在每个进程中也只能有一个。设置同类型的定时器会覆盖之前的设置。
相关推荐
DianSan_ERP3 小时前
如何通过抖店订单接口实现订单状态管理与履约自动化?
运维·自动化
b***25113 小时前
18650电池点焊机:电阻焊技术如何决定电池组的成败|深圳比斯特自动化
运维·自动化
原来是猿3 小时前
网络计算器:理解序列化与反序列化(中)
linux·运维·服务器·网络·tcp/ip
前端老曹4 小时前
Docker 从入门到放弃:完整指南
运维·docker·容器
AOwhisky4 小时前
虚拟化技术学习笔记
linux·运维·笔记·学习·虚拟化技术
rabbit_pro5 小时前
Docker compose部署Ollama使用模型
linux·运维·docker
笑洋仟7 小时前
docker的overlay2目录占用磁盘空间很大,清理办法
运维·docker·容器
m0_738120727 小时前
ctfshow靶场SSRF部分——基础绕过到协议攻击解题思路与技巧(一)
服务器·前端·网络·安全·php
木雷坞7 小时前
2026 年 5 月国内可用 Docker 镜像源列表与配置方法
运维·docker·容器