Linux C/C++ timeout命令实现(运行具有时间限制)
Linux附带了大量命令,每个命令都是唯一的,并在特定情况下使用。Linux timeout命令的一个属性是时间限制。可以为任何命令设置时间限制。如果时间到期,命令将停止执行。
如何使用timeout命令
我们将解释如何使用Linux timeout命令
timeout [OPTION] DURATION COMMAND [ARG]…
timeout [OPTION]
DURATION可以是正整数或浮点数,后跟可选的单位后缀:
s - seconds (default)
m - minutes
h - hours
d - days
未使用单位时,默认为秒。如果持续时间设置为零,则禁用关联的超时。
其他选项
DESCRIPTION--preserve-status以与COMMAND相同的状态退出,即使命令超时--foreground当不直接从shell提示符运行超时时,允许COMMAND从TTY读取并获得TTY信号;在此模式下,COMMAND的子级不会超时-k, --kill-after=DURATION如果COMMAND仍在运行,也发送KILL信号在发出初始信号后很久-s, --signal=SIGNAL指定超时时要发送的信号;SIGNAL可以是类似“HUP”的名称或数字;有关信号列表,请参见“kill-l”--help显示此帮助并退出 --version输出版本信息并退出
如何使用timeout命令的基本示例
- 1.设置定时间后终止命令:
timeout 30 ping www.baidu.com
通过使用超时,我们可以确保ping不会一直运行,占用网络带宽并纠缠任何正在ping的设备。
此命令允许ping运行五秒钟。它正在对www.baidu.com的域名进行ping,用于研究本文的测试网络上。
如果程序的执行在超时终止之前结束,超时可以将退出代码从程序传递回shell,要实现这一点,程序必须自动停止(换句话说,它不会因超时而终止),并且必须使用–preserve-status选项。
如果使用值为5的-c(count)选项,ping将只发出5个请求。如果我们给超时一分钟,ping肯定会自行终止。然后我们可以使用echo检查退出值。
- 2.发送正确的信号
当timeout想要停止程序时,它会发送SIGTERM信号。这礼貌地要求程序终止。某些程序可能选择忽略SIGTERM信号。
我们可以通过请求超时来发送SIGKILL信号来实现这一点。可以使用-s(signal)选项告诉超时以发送SIGKILL信号。
timeout -s SIGKILL 20 sudo tcpdump -i ens33 -n -w 20230212.pcap
我们可以使用tcpdump 抓包的默认选项运行20秒后,发送SIGKILL信号终止进程。
- 3.尝试使用SIGTERM停止程序
我们使用-k(kill after)选项。-k选项需要一个时间值作为参数。在这个命令中,我们要求超时,让dmesg运行30秒,然后用SIGTERM信号终止它。如果dmesg在40秒后仍在运行,则意味着外交SIGTERM被忽略,超时应发送SIGKILL以完成任务。
timeout -k 40 30 dmesg -w
dmesg运行30秒,并在收到SIGTERM信号时停止。
Linux C/C++ timeout命令实现
...
int main(int argc, char** argv) {
...for(int i=1;i<argc;i++) {char* arg = argv[i];if(strlen(arg) <= 0) continue;if(arg[0] == '-') {if(!strcmp(arg, "-h") || !strcmp(arg, "--help")) {printHelp(argv[0]);return EXIT_SUCCESS;} else if(!strcmp(arg, "-9") || !strcmp(arg, "--kill")) {sig_kill = SIGKILL;...} else {fprintf(stderr, "Illegal argument: %s\n", arg);return EXIT_FAILURE;}} else {/* 没有更多选项。检查是否有足够的剩余参数基本语法是/程序[OPTIONS]超时程序[ARGS]而超时和程序是强制性的 */if (i+2 > argc) { // 检查是否给出超时和程序fprintf(stderr, "Not enough arguments. Check %s --help, if you need help\n", argv[0]);if(i+1 > argc) {// 检查参数是否为数字fprintf(stderr, " Missing: TIMEOUT PROGRAM\n");} else {if(is_numeric(argv[i]))fprintf(stderr, " Missing: PROGRAM\n");elsefprintf(stderr, " Missing: TIMEOUT\n");}return EXIT_FAILURE;} else {int seconds = atoi(argv[i]);if(seconds < 0) {fprintf(stderr, "Timeout cannot be negative");return EXIT_FAILURE;}timeout = (unsigned int)seconds;// 合并程序和可选程序参数for(int j=i+1;j<argc;j++)command = strappend(command, argv[j]);break;}}}// 检查程序参数if(command == NULL || strlen(command) <= 0) {fprintf(stderr, "Not enough arguments. Check %s --help, if you need help\n", argv[0]);fprintf(stderr, " Missing: TIMEOUT PROGRAM\n");return EXIT_FAILURE;}// Fork守护程序(如果需要)if (daemonize) {fork_daemon();}...int status;pid_t wait_status;// 信号处理器signal(SIGINT, sig_handler);signal(SIGTERM, sig_handler);signal(SIGALRM, sig_handler);if(verbose) printf("Child process forked with pid %d.\n", proc_pid);// 设置报警if(timeout > 0) alarm(timeout);wait_status = waitpid(proc_pid, &status, 0); // Wait for childruntime += millis();if(wait_status < 0) {fprintf(stderr, "Error waiting for process: %s\n", strerror(errno));return EXIT_FAILURE;}status = WEXITSTATUS(status); // 获取实际退出状态if(status != 0) {if(verbose) fprintf(stderr, "Process exited with status %d after %ld milliseconds\n", status, runtime);return status;} else {if(verbose) printf("Process completed after %ld milliseconds\n", runtime);return status;}}...
}
...
static void sig_handler(int sig_no) {switch(sig_no) {case SIGALRM:// Timeoutif(verbose)printf("TIMEOUT after %ld milliseconds.\n", runtime+millis());elseprintf("TIMEOUT\n");terminate_process();exit(EXIT_FAILURE);break;case SIGINT:case SIGTERM:if(proc_pid <= 0) exit(EXIT_FAILURE);if(verbose) printf("Program termination request\n");if(proc_pid > 0) kill(proc_pid, sig_no);exit(EXIT_FAILURE);return;}
}...
编译运行
If you need the complete source code of timeout, please add WeChat number (c17865354792)
总结
总结
timeout是一个命令行实用程序,它运行指定的命令,如果在给定的时间段后仍在运行,则终止该命令。
Welcome to follow WeChat official account【程序猿编码】
相关文章:

Linux C/C++ timeout命令实现(运行具有时间限制)
Linux附带了大量命令,每个命令都是唯一的,并在特定情况下使用。Linux timeout命令的一个属性是时间限制。可以为任何命令设置时间限制。如果时间到期,命令将停止执行。 如何使用timeout命令 我们将解释如何使用Linux timeout命令 timeout […...

西湖论剑初赛web wp
Node Magical Login 简单的js代码审计。 Flag分成了两部分。 第一部分: 这里就简单的判断了一下user是否等于admin,直接绕过。 第二部分: checkcode ! “aGr5AtSp55dRacer”,让其为真,利用数组绕过。 Flag为&#x…...
【YOLOv8/YOLOv7/YOLOv5系列算法改进NO.55】融入美团最新QARepVGG
文章目录 前言一、解决问题二、基本原理三、添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细…...

Flutter Windows端打包并生成可安装文件流程
Windows打包 1.首先安装visual Studio 下载地址:https://visualstudio.microsoft.com/zh-hans/ 下载成功后按照下图勾选桌面应用和移动应用下的使用C的桌面开发,勾选右侧安装详细信息中的windows 11/10 sdk 中的任意一个完成安装即可 2.打包Windows …...

凸优化学习:PART3凸优化问题(持续更新)
凸优化问题 凸优化问题的广义定义: 目标函数为凸函数约束集合为凸集 一、优化问题 基本用语 一般优化问题的描述: minimizef0(x)subject to fi(x)⩽0,i1,⋯,mhi(x)0,i1,⋯,p(1)\begin{array}{ll} \operatorname{minimize} & f_0(x) \\ \text { s…...
[ue4] 着色器绑定(Shader Binding)
当我们在ue4中制作了一个美术材质之后,引擎本身会为我们做很多事情,它会把结点翻译为hlsl,生成多个shader变体,并在多个mesh pass中去选择性的调用所需的shader,其中一个重要的过程就是获取shader绑定的数据。 本文将主…...
Rust语言之迭代器
文章目录Rust迭代器Rust迭代器的实现Iterator特型IntoIterator特型for循环与迭代器迭代器类型再看for循环实现自定义迭代器方式一方式二相关参考Rust迭代器 Rust语言内置了迭代器模式,用于实现对一个项的序列进行特定的处理,通常配合for循环使用。当我们…...

TreeSet 与 TreeMap And HashSet 与 HashMap
目录 Map TreeMap put()方法 : get()方法 : Set> entrySet() (重) : foreach遍历 : Set 哈希表 哈希冲突 : 冲突避免 : 冲突解决 ---- > 比散列(开放地址法) : 开散列 (链地址法 . 开链法) 简介 : 在Java中 , TreeSet 与 TreeMap 利用搜索树实现 Ma…...

Java围棋游戏的设计与实现
技术:Java等摘要:围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为S…...
第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat
文章目录第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat使用选项运行 irisstatirisstat Options第七十三章 使用 irisstat 实用程序监控 IRIS - 使用选项运行 irisstat 使用选项运行 irisstat 不带选项运行 irisstat 会生成基本报告。通常,…...
【博客619】PromQL如何实现Left joins以及不同metrics之间的复杂联合查询
PromQL如何实现Left joins以及不同metrics之间的复杂联合查询 1、场景 我们需要在PromQL中实现类似SQL中的连接查询: SELECT a.value*b.value, * FROM a, b2、不同metrics之间的复杂联合查询 瞬时向量与瞬时向量之间进行数学运算: 例如:根…...

Win11自定义电脑右下角时间显示格式
Win11自定义电脑右下角时间显示格式 一、进入附加设置菜单 1、进入控制面板,选择日期和时间 2、选择修改日期和时间 3、选择修改日历设置 4、选择附加设置 二、自定义时间显示出秒 1、在选项卡中,选时间选项卡 2、在Short time的输入框中输入H:m…...

TrueNas篇-trueNas Scale安装
安装TrueNAS Scale 在尝试trueNas core时发下可以成功安装,但是一直无法成功启动,而且国内对我遇见的错误几乎没有案例,所以舍弃掉了,而且trueNas core是基于Linux的,对Linux的生态好了很多,还可以可以在t…...

element表单搜索框与表格高度自适应
一般在后台管理系统中,表单搜索框和表格的搭配是非常常见的,如下所示: 在该图中,搜索框有五个,分为了两行排列。但根据大多数的UI标准,搜索框默认只显示一行,多余的需要进行隐藏。此时的页面被…...
MySQL使用技巧整理
title: MySQL使用技巧整理 date: 2021-04-11 00:00:00 tags: MySQL categories:数据库 重建索引 索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面…...

七大设计原则之里氏替换原则应用
目录1 里氏替换原则2 里氏替换原则应用1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,程序 P…...

1行Python代码去除图片水印,网友:一干二净
大家好,这里是程序员晚枫。 最近小明在开淘宝店(店名:爱吃火锅的少女),需要给自己的原创图片加水印,于是我上次给她开发了增加水印的功能:图片加水印,保护原创图片,一行…...
Connext DDS属性配置参考大全(2)
DDSSecure安全com.rti.servcom.rti.serv.load_plugin...
一起Talk Android吧(第四百九十二回:精简版动画)
文章目录概念介绍使用方法示例代码经验总结各位看官们大家好,上一回中咱们说的例子是"动画集合:AnimatorSetBuilder",这一回中咱们说的例子是" 精简版动画"。闲话休提,言归正转,让我们一起Talk Android吧&…...

seata源码-全局事务回滚服务端源码
这篇博客来记录在发起全局事务回滚时,服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中,有说到过,事务发起者在发现分支事务执行异常之后,会提交全局事务回滚的请求到netty服务端,这里是发…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...