工作中,需要使用tftp等协议下载一些文件,但这时候遇到一个问题就是当tftp的服务器没有打开时,system

函数会阻塞较长时间(长达树秒),这时候首先想到的就是设置tftp的超时参数,但因为还有很多协议也有超时返回

的需求,我就想一劳永逸的封装一个函数来完成这项任务。最后决定重写一下system并设置超时函数,封装的函数

如下(system_timeout).这里需要解释进行两层封装的原因:在system_timeout中我们将_system_timeout进行了一层封装,

并将信号SIGCHLD设置为SIG_DFL是因为我们在_system_timeout中调用了waitpid,而这个函数在SIGCHLD被忽略是会

产生ECHILD错误,手册解释如下:

ERRORS

ECHILD (for waitpid() or waitid()) The process specified by pid (wait-pid()) or idtype and id (waitid()) does

not exist or is not a child of the calling process. (This can happen for one's own child if the action for SIGCHLD

is set to SIG_IGN. See also the Linux Notes section about threads.)

#include <sys/wait.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int _system_timeout(const char *cmdstring, int timeout);    /*one hundred of a second*/
int system_timeout(const char *cmdstring, int timeout);  int main(int argc, char **argv)
{if (argc != 2) {printf("usage:%s [command]\n", argv[0]);}if (0 != system_timeout(argv[1], 50)) {printf("system_timeout error \n");return -1;}printf("system_timeout success\n");return 0;
}int _system_timeout(const char *cmdstring, int timeout)
{pid_t pid;int status;struct sigaction ignore, saveintr, savequit;sigset_t chldmask, savemask;if (cmdstring == NULL)return 1;ignore.sa_handler = SIG_IGN;sigemptyset(&ignore.sa_mask);ignore.sa_flags = 0;if (sigaction(SIGINT, &ignore, &saveintr) < 0) {return -1;}if (sigaction(SIGQUIT, &ignore, &savequit) < 0) {return -1;}sigemptyset(&chldmask);sigaddset(&chldmask, SIGCHLD);if (sigprocmask(SIG_BLOCK, &chldmask, &savemask) < 0) {return -1;}if ((pid = fork()) < 0) {return -1;} else if (pid == 0) {sigaction(SIGINT, &saveintr, NULL);sigaction(SIGQUIT, &savequit, NULL);sigprocmask(SIG_SETMASK, &savemask, NULL);execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);_exit(127);} else {usleep(timeout * 10000);kill(pid, SIGKILL);waitpid(pid, &status, 0);}if (sigaction(SIGINT, &saveintr, NULL) < 0) {return -1;}if (sigaction(SIGQUIT, &savequit, NULL) < 0) return -1;if (sigprocmask(SIG_SETMASK, &savemask, NULL) < 0)return -1;return status;
}int system_timeout(const char *cmdstring, int timeout)
{int ret = 0;struct sigaction chldnew, chldold;if (cmdstring == NULL) return -1;bzero(&chldnew, sizeof(struct sigaction));bzero(&chldold, sizeof(struct sigaction));chldnew.sa_handler = SIG_DFL;sigemptyset(&chldnew.sa_mask);chldnew.sa_flags = 0;if (sigaction(SIGCHLD, &chldnew, &chldold) < 0) {return -1;}if ((timeout * 10000) < 0) {return -1;} else if (timeout == 0) {ret = system(cmdstring);} else {ret = _system_timeout(cmdstring, timeout);}if (sigaction(SIGCHLD, &chldold, NULL) < 0) {return -1;}return ret;
}

转自:https://blog.csdn.net/shanguangy111/article/details/47185533

这块需要视项目的实际情况来修改代码即可。

带超时的system相关推荐

  1. windows下带超时的telnet探测IP和端口

    玩树莓派由于没有屏幕,IP可能会跳,这时就不知道自己的树莓派是哪个IP了,下面可以用这个程序去探测自己树莓派的IP.其主要思想是:非阻塞的带超时的connect函数. #include <std ...

  2. Redisson(2-2)分布式锁实现对比 VS Java的ReentrantLock之带超时时间的tryLock

    Redisson实现了一整套JDK中ReentrantLock的功能,这里对比一下实现的差异和核心的思想. unfair模式的带超时时间的tryLock(超时时间) ReentrantLock 这里上 ...

  3. 带超时的recv函数

    周末了,用纯C/C++写了一个服务端,简单: #include <winsock2.h> #include <stdio.h> #pragma comment(lib, &qu ...

  4. android技巧:把自己的app变成手机系统自带的app[/system/app]

    如何把自己喜欢的app放到系统app里,其实很简单,只需要2部分操作 1.先把手机ROOT了,这步是前提. 2.如果你用文件管理器的话,就需要把自己喜欢的app直接 复制到 /system/app目录 ...

  5. java 带超时时间lru_如何在O(1)时间复杂度下实现LRU

    LRU,即最近最少使用,在 redis 里缓存的淘汰策略就有用到这一个算法,今天我们自己来实现一个 LRU,并且存取时间复杂度控制在 O(1)文字好像有点多,代码也会有 一.题意分析 通常我们会把频繁 ...

  6. 高并发编程-自定义带有超时功能的锁

    文章目录 概述 步骤 自定义超时异常处理类 ILock接口 实现类 测试 存在的问题 修复存在的问题 超时功能 测试超时功能 CustomLock 概述 我们知道synchronized的机制有一个很 ...

  7. 一文带你熟透Java线程池的使用及源码

    在单个线程使用过程中遇到的问题(new Thread().start): 线程的频繁创建与销毁 线程执行数据多且高频,频繁CPU上下文切换,造成CPU的资源浪费 以上种种问题,让我们不禁想到,怎么复用 ...

  8. linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时

    一.使用alarm 函数设置超时 C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13   void handler( int sig) { } signal(SIGALRM ...

  9. redis使用sysc超时_基于redis的分布式锁实现

    随着业务越来越复杂,应用服务都会朝着分布式.集群方向部署,而分布式CAP原则告诉我们,Consistency(一致性). Availability(可用性).Partition tolerance(分 ...

最新文章

  1. 身为 Java 程序员必须掌握的 10 款开源工具!
  2. socket之send和recv原理剖析
  3. 效率 qt_Qt开发之Go篇(三)
  4. struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别
  5. Spring IOC快速入门
  6. 常用的函数式接口_Function接口
  7. 实体安全主要指计算机及网络硬件设备,计算机安全中的实体安全主要是指什么?...
  8. How myTask application is loaded in CreateFromAccount scenario
  9. 54失败是成功之母二
  10. zxing二维码的生成与解码(C#)
  11. 墨菲定律 -- 笔记
  12. TypeError: softmax() got an unexpected keyword argument 'axis'
  13. Google Chrome 调试JS简单教程[更新]
  14. Visual Studio 水晶报表Crystal Reports
  15. MagicDraw-IBD图
  16. thinkpad T580加装内存条
  17. NGS 测序深度和覆盖度—Depth、Coverage
  18. C#从图中截取部分图片 代码实现截图
  19. 自定义时间(小时:分钟)选择器
  20. AISummit全球人工智能技术大会,洞悉AI技术的现在与未来

热门文章

  1. mycat从0到成功进行分表操作
  2. 1003 Emergency (25 分)【Dijastra与DFS解法】
  3. java 反射获取实体类_Java 通过反射给实体类赋值操作
  4. Tomcat中session的管理机制
  5. todo已完成任务_重要主干街路已完成清雪任务
  6. qpython numpy_Python-Numpy全面精简教程
  7. python爬虫导入数据库_python爬虫爬下来的数据怎么导入到MySQL
  8. 易语言 服务器抓包,易语言抓包获得地址实现TP路由器登陆的代码
  9. KEY键盘映射_手焊键盘,使用Python编写,一键放连招,还有什么你不会
  10. 关系代数的自然连接符号_初中数学知识清单之代数式的认识