Socket编程中Interrupted system call 解释及解决办法

转载出处: http://blog.chinaunix.net/uid-25885064-id-3071372.html


我们用术语慢系统调用(slow system call)描述accept函数,该术语也适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用有可能永远无法返回,多数网络支持函数都属于这一类。举例来说,如果没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证。类似的,如果客户端从未发送过数据,那么read调用将永不返回。其他慢系统调用的例子是对管道和终端设备的读和写。一个值得注意的例外是磁盘IO,它们一般都会返回到调用者(假设没有灾难性的硬件事故)。
    适用于慢系统调用的基本规则是:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应处理函数返回时,该系统调用可能返回一个EINTR错误。所以,我们必须对慢系统调用返回的EINTR有所准备。
    为了处理被中断的accept,可以改成如下形式:

  1. for (;;) 
  2. {
  3.     if((connfd=accept(listenfd,NULL, NULL)) < 0) 
  4.     {
  5.         if (errno == EINTR)
  6.             continue;
  7.         else
  8.             printf("accept error");
  9.     } 
  10. }
     这段代码所做的事情就是自己重启被中断的系统调用。对于accept,以及诸如read、write、select和open之类的函数,这是适合的。不过有一个函数我们不能重启:connect。如果该函数返回EINTR,我们就不能再次调用它,否则将立即返回一个错误。当connect被一个捕获信号中断而且不自动重启时,我们必须调用select来等待连接完成。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Interrupted system call" 是指一个系统调用被一个信号断了。在Unix或类Unix系统,信号可以被进程或操作系统发送给进程,以通知它发生了某些事件或错误。当一个进程在执行系统调用时,如果它接收到一个信号,系统调用可能会被断并返回一个错误代码 EINTR,表示这个操作被断了。这个错误代码通常需要被处理,以确保系统调用能够继续执行或恢复执行。 ### 回答2: "interrupted system call" 是一个指在操作系统经常遇到的错误消息,通常会出现在一个进程正在执行系统调用(system call)的过程断时。这个错误消息表明在执行过程发生了某种断事件,导致系统调用无法完成。 断事件可以是多种原因引起的,例如,当进程收到一个信号时,操作系统可能会断当前的系统调用来处理该信号。另外,计时器到期、输入/输出操作出现错误、内存访问违规等情况也可能导致系统调用断。 当一个系统调用被断时,操作系统会将正在执行的系统调用的状态保存起来,然后将控制权返回到调用它的进程。进程可以通过检查系统调用的返回值来确定系统调用是否成功完成,如果系统调用被断,则通常返回一个特殊的错误码。 对于开发者而言,处理 "interrupted system call" 错误通常需要检查系统调用的返回值,并根据具体情况采取相应的处理措施。这可能包括重新尝试系统调用、忽略断事件、处理发生的错误等。 总之,"interrupted system call" 是一个常见的操作系统错误消息,表示在执行系统调用的过程发生了断事件,进程需要根据错误码和具体情况来进行处理。 ### 回答3: "interrupted system call"是一个指在进行系统调用过程断的情况。在操作系统,系统调用是应用程序与操作系统之间进行交互的机制。当应用程序需要执行一些特权操作或访问底层资源时,就会发起一个系统调用。 在执行系统调用期间,操作系统可能会发生一些断事件,例如定时器断、硬件断等。当断事件发生时,操作系统会暂停当前正在执行的进程,切换到断处理程序执行。一旦断事件的处理完成,操作系统会再次返回原来的进程继续执行。 在这个过程,如果一个系统调用未能完成,就会出现"interrupted system call"的情况。这通常是由于断事件断了系统调用的执行。例如,在进行IO操作时,如果设备断发生,操作系统会断当前的系统调用,并开始处理设备断。一旦设备断处理完成,操作系统会再次返回原来的系统调用。 当出现"interrupted system call"时,操作系统会将一个特定的错误码返回给应用程序,以表示系统调用被断的原因。应用程序可以根据错误码来做相应的处理,例如重新发起系统调用或进行错误处理。 总之,"interrupted system call"表示在系统调用过程由于断事件的发生而导致系统调用被断。这是操作系统的正常行为,应用程序可以根据错误码来进行相应的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值