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),每种类型在每个进程中也只能有一个。设置同类型的定时器会覆盖之前的设置。
相关推荐
考虑考虑1 小时前
数据库中的EXISTS
运维·数据库·后端
爱网络爱Linux1 小时前
【系列】每天一个 Linux 命令(53)startx 命令
linux·rhce·rhca·linux运维·linux命令大全·红帽认证
ZhengEnCi1 小时前
L2A-一个域名如何访问多台云服务器-子域名、路径前缀与Nginx反向代理选型指南
linux·人工智能
M78佐菲2 小时前
51单片机学习笔记:ds18b20要点整理
linux·笔记·嵌入式硬件·学习·51单片机
高亦真2 小时前
今天是学习嵌入式的第37天
linux·学习·算法
一个有温度的技术博主2 小时前
Linux 核心命令速查指南:从文件操作到系统运维
linux·服务器
小小的木头人3 小时前
Docker 环境下迁移 containerd 数据目录:从 `/var/lib/containerd` 到 `/data/containerd`
linux·docker
天远数科3 小时前
零信任架构实战:基于天远全能消金报告构建自动化信贷评估网关
运维·人工智能·架构·自动化
东城居士3 小时前
验证第一个Linux字符驱动程序
linux·嵌入式系统
Winner_hwx4 小时前
华为ICT大赛备赛复习1
服务器·网络·华为