EINTR错误】的更多相关文章

慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用.永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类.如:若没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证. EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误.例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致…
转自:http://www.xuebuyuan.com/1470645.html 最近在工作中遇到了EINTR错误,感到比较困惑,几番研究之后,颇有心得和收获,特记录如下,便于以后查询,也给有同样困惑的朋友们提供一点借鉴. 我们经常在网络编程中会看到这样,当执行一个可能会阻塞的系统调用后,在返回的时候需要检查下错误码(if errno == EINTR),如果是这样的错误,那我们一般会重新执行该系统调用.所以经常的写法是: repeat: if(read(fd, buff, size) < 0)…
https://www.cnblogs.com/flyfish10000/articles/2576885.html EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误.例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致使accept返回一个EINTR错误(被中断的系统调用). 当碰到EINTR错误的时候,可以采取有一些可以重启的系统调用要进…
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> #include <signal.h> #include <sys/s…
最近在公司项目中突然报错如下 “connect: Interrupted system call”, 经过查找代码发现是在创建 socket 中执行了 connect 函数失败导致.上网查阅资料发现这是 信号中断EINTR 与 慢系统调用 的问题. 慢系统调用:可能永远阻塞的系统调用. EINTR说明:如果进程在一个慢系统调用(slow system call)中阻塞时,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“In…
转自:http://blog.chinaunix.net/uid-21501855-id-4490453.html 这几天,写服务器代码过程当中,遇见EINRT信号的问题,我是借鉴 <unp >,采用continue或者goto again循环解决的.但是感觉这个还是很有必要记录一下.网络上查找到的信息很多.下面是我查找到的和EINTR有关的介绍: 1  http://blog.csdn.net/yanook/article/details/7226019  慢系统调用函数如何处理中断信号EI…
errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1.并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen(). erron存放一个正整数来保存上次出错的错误值. 对线程而言.每一个线程都有专用的errno变量.不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified s…
慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用.永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类.如:若没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证.EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误.例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致使…
POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945. 信号(signal)就是通知某个进程发生了某个事件,有时也称为软件中断(software interrupt).信号通常是异步发生的,也就是说进程预先不…
参考链接:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx 1.getsockname和getpeername getsockname函数获取与套接口关联的本地协议地址. getpeername函数获取与套接口关联的远程协议地址. ---------------------------------------------------------------------- #include <sys/socket.h> int …
信号用于通知进程发生了某件事情,可以由一个进程发给另一个进程,也可以由内核发个一个进程. 每个信号都有一个关联的行为,可以通过sigaction函数来设置一个信号的行为,有3种选择: 1.定义一个信号处理函数捕获信号,在信号发生时被调用.SIGKILL和SIGSTOP信号不能捕获 信号处理函数原型:void handler (int signo) 2.忽略信号,即把信号的行为设定为SIG_IGN,同样SIGKILL和SIGSTOP信号不能忽略 3.缺省行为,即把信号行为设定为SIG_DFL si…
epoll用法回顾 先简单回顾下如何使用C库封装的3个epoll相关的系统调用.更详细的用法参见http://www.cnblogs.com/apprentice89/archive/2013/05/06/3063039.html int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_…
System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的系统内核中,后来商用UNIX系统基本都加入了System V IPC的功能. System V消息队列相对于POSIX消息队列的区别主要是: POSIX消息队列的读操作总是返回消息队列中优先级最高的最早消息,而对于System V消息队列可以返回任意指定优先级(通过消息类型)的消息. 当向一个空消息…
  Epoll详解及源码分析 1.什么是epoll epoll是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,都是I/O多路复用(IO multiplexing)技术,按照man手册的说法:是为处理大批量句柄而作了改进的poll. Linux下有以下几个经典的服务器模型: ①Apache模型(Process Per Connection,简称PPC) 和 TPC(Thread Per Connection)模型 这两种模型思…
最近在看APUE第10章中关于system函数的POSIX.1的实现.关于POSIX.1要求system函数忽略SIGINT和SIGQUIT,并且阻塞信号SIGCHLD的论述,理解得不是很透彻,本文就通过实际的实例来一探究竟吧. 一.为什么要阻塞SIGCHLD信号 #include <stdlib.h> int system(const char *command); 函数工作大致流程:system()函数先fork一个子进程,在这个子进程中调用/bin/sh -c来执行command指定的命…
1.   #define LOWER(c)            (unsigned char)(c | 0x20) 换成小写 2.   gcc -Wall -Werror //告警当成 错误来处理 3.  gcc -Ox  //优化等级,一般debug搞成0, release搞成3 4. 一种处理错误码的方法 不说什么,贴代码 #include <stdio.h> #define HTC_ERROR_MAP(xx) \ xx(OK, "SUCCESS")\ xx(INVA…
上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数. 一  sigaction函数的作用 定义在接收到参数sig指定的信号后应该采取的行动,声明如下: #include <signal.h> int sigaction(int sig, //指定动作的信号码 const struct sigaction * act, //说明要采取的动作,如果为NULL,对sigaction的调用就不能改变与信…
1.epoll_create函数 函数声明:int epoll_create(int size) 该 函数生成一个epoll专用的文件描述符.它其实是在内核申请一空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件.size就是你在这个epoll fd上能关注的最大socket fd数.随你定好了,前提是有足够的空间. 2. socket 函数 函数原型 int socket(int domain, int type, int protocol); 应用程序调用socket函数…
问题聚焦:     在前面我们大概浏览了一下服务器编程需要掌握的一些知识和技术,以及架构思想.        实践,才是检验真理的唯一标准..从这节起我们将在这些技术的基础上,一步步实现以及完善一个服务器,同时也是对这些技术的更深入的思考.     本节我们将实现一个简单的回射服务器,包括TCP连接,文本处理,并发(多进程实现),以及子进程退出后的处理动作.   功能描述:     客户端与服务器端进行TCP连接     客户端从标准输入(键盘)读入一行文本,发送给服务器     服务器从网络输…
Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进程默认忽略了该信号.为避免僵尸进程的产生,无论我们什么时候创建子进程时,主进程都需要等待子进程返回,以便对子进程进行清理.为此,我们在服务器程序中添加SIGCHLD信号处理函数. 代码如下: #include <stdlib.h> #include <stdio.h> #include…
SOCKET网络编程快速上手(二)——细节问题(5)(完结篇) 6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢?如果EINTR前,三次握手已经发起,我们当然希望链路就此已经建立完成,不要再重新走流程了.这个时候我们就需要为connect量身定做一个使用方案.代码如下:  connectWithTimeout STATUS connectWithTimeout(int sock, struct sockadd…
6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢?如果EINTR前,三次握手已经发起,我们当然希望链路就此已经建立完成,不要再重新走流程了.这个时候我们就需要为connect量身定做一个使用方案.代码如下: STATUS connectWithTimeout(int sock, struct sockaddr*addrs, int adrsLen,struct timeval* tm) { ; int len…
5.慢系统调用及EINTR 还记得前面readn和writen函数么?里面有个EINTR,现在就来谈谈这个,这个很重要. Linux世界有个叫信号的东西,感觉他就像一位隐士,很少遇到他,而他又无处不在.当你船到桥头时,他从天而降,将你领入另一片天地.(唉,博客再写下去我都可以改行了)前面已经初步窥探了信号的神奇,一个“小小”的SIGPIPE能让我们不知道怎么回事就惨遭“灭门”.那还有其他千千万万的信号呢,是不是也会对我们写的网络程序表现出神奇的现象.答案:有!还有很多! 写到这,才发现自己还没涉…
SOCKET网络编程快速上手(二)——细节问题(4) 5.慢系统调用及EINTR 还记得前面readn和writen函数么?里面有个EINTR,现在就来谈谈这个,这个很重要. Linux世界有个叫信号的东西,感觉他就像一位隐士,很少遇到他,而他又无处不在.当你船到桥头时,他从天而降,将你领入另一片天地.(唉,博客再写下去我都可以改行了)前面已经初步窥探了信号的神奇,一个“小小”的SIGPIPE能让我们不知道怎么回事就惨遭“灭门”.那还有其他千千万万的信号呢,是不是也会对我们写的网络程序表现出神奇…
字节流套接字上调用read或write,输入或输出的字节数可能比请求的数量少,这个现象的原因在于内核中用于套接字的缓冲区可能已经达到了极限.此时所需要的是调用者再次调用read或write函数.这个现象在read()一个字节流套接字时很常见,但是在write()一个字节流套接字时只能在该套接字为非阻塞的前提下才出现. connect()函数 1)若客户没有收到SYN分节的响应,则返回ETIMEDOUT错误: 2)若对客户的SYN响应是RST,则表明服务器在指定的端口上没有进程在等待与之连接,客户…
1 梳理: 应用层的下一层是传输层,而http协议一般是使用tcp的,所以实现tcp的重要性就不言而喻. 由于tornado中实现了ioloop这个反应器以及iostream这个对连接的异步读写,所以tcp就很容易实现异步. 在tornado的tcpserver文件中,实现了TCPServer这个类,他是一个单线程的,非阻塞的tcp 服务. 为了与上层协议(在tornado中就是HTTPServer)交互,TCPServer提供了一个接口:handle_stream, 要求其子类必需实现该方法.…
epoll是I/O复用模型中相对epoll和select更高效的实现对套接字管理的函数. epoll有两种模式 LT 和 ET 二者的差异在于 level-trigger 模式下只要某个 socket 处于 readable/writable 状态,无论什么时候进行 epoll_wait 都会返回该 socket:而 edge-trigger 模式下只有某个 socket 从 unreadable 变为 readable 或从unwritable 变为 writable 时,epoll_wait…
       epoll模型有两种工作模式,ET和LT两种模式下都有一些细节值得注意,以下是一些思考:   一.ET模式下 Q1:调用accept时,到底TCP完成队列里有多少个已经建立好的连接? 这里又得分情况来说: 没有连接.这种情况发生在TCP连接被客户端夭折,即在服务端调用accept之前客户端给出一个RST.该RST导致刚刚建立好的连接从服务器端的TCP完成队列中被移出.源自berkeley的实现会在内核处理该事件,并不会将该事件通知给服务程序,如果套接口被设置为阻塞模式,就会导致ac…
信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程. 针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤: 建立SIGIO信号的信号处理函数. 设置该套接字的属主,通常使用fcntl的F_SETOWN命令设置. 开启该套接字的信号驱动式I/O,通常通过使用fcntl的F_SETFL命令打开O_ASYNC标志完成. 1.对于UDP套接字的SIGIO信号 在UDP上使用信号驱动式I/O是简单的.SIGIO信号在发生以下事件时产生: (1)数据报到达…
在涉及套接字的I/O操作上设置超时的方法有以下3种: 调用alarm,它在指定超时期时产生SIGALRM信号.这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用. 在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在read或write调用上. 使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项.这个方法的问题在于,并非所有实现都支持这两个套接字选项. 1.使用SIGALRM为connect设置超时 如下给…