使用SIGALRM信号为阻塞操作设置超时
我们经常会遇到为阻塞操作设置超时的问题,比如说阻塞套接字read读取设置10秒超时,其中一个办法就是调用alarm函数,它在指定超时时期产生SIGALRM信号,使得阻塞操作中断。
但其弊端在于:
1、可能干扰进程中现有的alarm调用,如timer、settimer、sleep等。
2、在多线程化程序中正确使用信号却非常困难;所以建议只是在未线程化或单线程化的程序中使用本技术。
#include <stdio.h>
#include <netinet/in.h>//for struct sockaddr_in
#include <string.h>//for memset
#include <signal.h>//for signal typedef void (*sighandler_t)(int); static void
read_alarm(int signo)
{
return;
} int main()
{
int conn_sock;
struct sockaddr_in ser_addr;
int ret;
char buf[];
sighandler_t src_sig;
struct sigaction sa_alarm; conn_sock = socket(AF_INET, SOCK_STREAM, );
if (conn_sock < )
{
perror("socket error");
return -;
} memset(&ser_addr, , sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons();
inet_pton(AF_INET, "127.0.0.1", &ser_addr.sin_addr); ret = connect(conn_sock, (struct sockaddr *)&ser_addr, sizeof(ser_addr));
if (ret < )
{
perror("connect error");
return -;
} //src_sig = signal(SIGALRM, read_alarm);
sa_alarm.sa_flags = SA_RESETHAND;
sa_alarm.sa_handler = read_alarm;
sigaction(SIGALRM, &sa_alarm, NULL);
alarm();
ret = read(conn_sock, buf, sizeof(buf));
if (ret < )
{
perror("read error");
}
else if (ret == )
{
printf("close by peer\n");
}
else
{
printf("recv %d bytes\n", ret);
}
alarm();
//signal(SIGALRM, src_sig);
return ;
}
运行结果:
read error: Interrupted system call
在linux系统中使用signal函数,read超时10秒后不会被中断,因为中断后会自动重启被中断的read。
需要采用segaction函数来验证,当read超过10秒时,alarm发出SIGALRM信号,read被中断。
使用SIGALRM信号为阻塞操作设置超时的更多相关文章
- 服务器编程入门(13) Linux套接字设置超时的三种方法
摘要: 本文介绍在套接字的I/O操作上设置超时的三种方法. 图片可能有点宽,看不到的童鞋可以点击图片查看完整图片.. 1 调用alarm 使用SIGALRM为connect设置超时 设置方法: ...
- SIGALRM信号和SIGCHID信号
在进行堵塞式系统调用时.为避免进程陷入无限期的等待,能够为这些堵塞式系统调用设置定时器.Linux提供了alarm系统调用和SIGALRM信号实现这个功能. 要使用定时器.首先要安装SIGALRM信号 ...
- linux中的两个很重要的信号:SIGALRM信号和SIGCHID信号
在进行堵塞式系统调用时.为避免进程陷入无限期的等待,能够为这些堵塞式系统调用设置定时器.Linux提供了alarm系统调用和SIGALRM信号实现这个功能. 要使用定时器.首先要安装S ...
- Unix网络编程 高级IO套接字设置超时
我们知道.对于一个套接字的读写(read/write)操作默认是堵塞的.假设当前套接字还不可读/写,那么这个操作会一直堵塞下去,这样对于一个须要高性能的server来说,是不能接受的.所以,我们能够在 ...
- Linux系统编程(23)——信号的阻塞
实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未决状态,直到进程 ...
- 2.3 linux中的信号分析 阻塞、未达
信号的阻塞.未达: linux中进程1向进程2发送信号,要经过内核,内核会维护一个进程对某个信号的状态,如下图所示: 当进程1向进程2发送信号时,信号的传递过程在内核中是有状态的,内核首先要检查这个信 ...
- python调用函数设置超时机制
有时候需要给函数设置超时机制,以防止它卡住我们的程序,这里可以用python的signal模块,signal模块可以实现程序内部的信号处理. # coding:utf8 import time imp ...
- FFmpeg命令读取RTMP流如何设置超时时间
子标题:FFmpeg命令录制RTMP流为FLV文件时如何设置超时时间 | FFmpeg命令如何解决录制产生阻塞的问题0x001: 前言 今天在测试程序时遇到两个问题.Q1:ffmpeg录制RTMP流并 ...
- accpet和connect设置超时
三次握手 TCP连接建立的开始是三次握手,通过三次交互确认连接成功,在客户端调用connect时,客户端发送sync消息给服务端,服务端收到sync消息后,返回一个ack+sync,并等待ack,客户 ...
随机推荐
- ZYNQ. LwIP.PHY.KSZ9031RNX
新一块板子 米尔科技的 z-turn 使用的PHY芯片是Micrel的 KSZ9031RNX 而不是zedboard上的Marvell的. 直接使用lwip的echo server demo时会报错 ...
- 【干货】Windows内存获取和分析---查找恶意进程,端口
来源:Unit 5: Windows Acquisition 5.1 Windows Acquisition Windows Memory Acquisition and Analysis 调查人员检 ...
- 【ARTS】01_04_左耳听风-20181203~1209
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 走进异步编程的世界--async/await项目使用实战
起因:今天要做一个定时器任务:五分钟查询一次数据库发现超时未支付的订单数据将其状态改为已经关闭(数据量大约100条的情况) 开始未使用异步: public void SelfCloseGpPayOrd ...
- spring-mvc集成 swagger
问题1:spring-mvc集成 swagger, 配置好后界面 404, 原因: dispatcher-servlet.xml 文件中, 要在这上面 <!-- 启用spring mvc 注解 ...
- shell升级
对/sbin/nologin的理解 系统账号的shell使用 /sbin/nologin ,此时无法登陆系统,即使给了密码也不行. 所谓“无法登陆”指的仅是这个用户无法使用bash或其他she ...
- 压缩跟踪Compressive Tracking(转)
这位博主总结的实在太好了,从原理到论文到代码,连论文都不用看:论文:http://blog.csdn.net/zouxy09/article/details/8118360 代码部分:http://b ...
- python日常
1.远程访问远程访问Jupyter Notebook,本地浏览器不能打开,先查了防火墙的状态,然后将设置的端口进行allow,网址,仍然拒绝链接,而后通过远程访问Jupyter Notebook,然后 ...
- SqlServer共用表达式(CTE)With As
共用表表达式(CTE)可以看成是一个临时的结果集,可以再SELECT,INSERT,UPDATE,DELETE,MARGE语句中多次引用. 一好处:使用共用表表达式可以让语句更加清晰简练. 1.可以定 ...
- C#控制台程序输出彩色文字
/* * 由SharpDevelop创建. * 用户: 从前的我 * 日期: 2012-06-03 * 时间: 21:30 * * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */ u ...