当前位置:  技术问答>linux和unix

使用socket的accept()函数时Interrupted system call问题

    来源: 互联网  发布时间:2016-07-21

    本文导语:  程序执行到accept时报错Interrupted system call,如果注释掉checkNode()就可以执行,请问这是怎么回事? int main() {       ...         /*定时检测节点是否存活*/    checkNode();    ...    while(1)   {      if((client_f...

程序执行到accept时报错Interrupted system call,如果注释掉checkNode()就可以执行,请问这是怎么回事?
int main()
{
      ...   

     /*定时检测节点是否存活*/
   checkNode();

   ...
   while(1)
  {
     if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){
    perror("accept socket error");
  exit(1);
 }
    ...

   } 
  ...
}

checkNode代码为:
void checkNode( )
{
   int res = 0;
  // Register checkNodeAlive to SIGALRM
  signal(SIGALRM, checkNodeAlive);
  
  struct itimerval tick;
  // Initialize struct
  memset(&tick, 0, sizeof(tick));
  // Timeout to run function first time
  tick.it_value.tv_sec = 3;  // sec
  tick.it_value.tv_usec = 0; // micro sec.
  // Interval time to run function
  tick.it_interval.tv_sec = 30;
  tick.it_interval.tv_usec = 0;
  // Set timer, ITIMER_REAL : real-time to decrease timer,
  res = setitimer(ITIMER_REAL, &tick, NULL);
  if (res) {
    printf("Set timer failed!!n");
    exit(1);
  }
}

checkNodeAlive函数代码

void checkNodeAlive(int num) 
{
  printf("setitimer");
  return;
}


也试过在accept()函数里加上
if (errno == EINTR) continue;
那么运行的时候提示Alarm clock就结束了。

|

void checkNodeAlive(int num) 
{
  printf("setitimer");
  return;
}

加一行变成

void checkNodeAlive(int num) 
{
  signal(SIGALRM, checkNodeAlive);
  printf("setitimer");
  return;
}

|
Linux所有的阻塞式系统调用都会跟信号中断,所以accept报Interrupted system call很正常,因为你的设置了定时信号。当时间到的时候本进程会收到SIGALRM信号,从而accept被中断。

|
exit(1); 去掉,或者改成break

    
 
 

您可能感兴趣的文章:

  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 怎样在使用curses字符串输出函数或字符输出函数时,隐藏光标
  • php使用socket_bind()函数绑定IP地址
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • 请问在REDHAT下使用gcc编译器用的是什么函数库,函数库的资料应该上哪儿找?
  • 请问有没头函数<pthread.h>和<signal.h>里的函数的详细功能介绍?和使用方法???
  • getaddrinfo这个函数是从哪里获取信息的?使用这个函数究竟哪里方便了。。
  • 很菜,shell脚本中怎么写函数,怎么使用带参数的函数???
  • Python过滤函数filter()使用自定义函数过滤序列实例
  • 急:unix的shell脚本中,定义了一个函数getDate(),在后面的执行命令参数用要使用这个函数的返回值,应该怎么写?
  • 请问如何在一个函数内部定义的一个新类中使用函数里声明的变量
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • 在shell中使用mail函数的时候如何使用变量
  • 调用同一个函数建立的多个线程,如何使用函数的数据?
  • 关于如何使用内核函数的问题
  • C语言应用程序使用的函数来源于libc库, Libc库中的函数是在哪里实现的??
  • 线程函数中使用setpriority函数的作用
  • 使用tcgetattr函数与tcsetattr函数的问题
  • 一个数据库函数的使用?
  • linux 下使用 sendmsg 函数 udp 通信问题???
  • 急问:Linux程序中,使用system函数的几个问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 怎样解决"Cannot set Socket Options for Trasnmit Socket" error 当使用setsockopt() 在solaris 5.8
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • socket编程,使用recvfrom()函数监听问题。
  • 如何使用另外进程的socket
  • linux无线网络传输也可以直接使用socket接口编程吗?
  • Linux下的Socket通信如何断开连接的端口从而实现重复使用该端口
  • linux下面如何查询某个进程正在使用的socket句柄数量
  • 请问可以在一个Servlet里使用多线程和SOCKET吗?
  • 怎样使用socket方式取得web服务器上的页面
  • linux 下使用socket, link时候一堆undefined reference
  • 如何在redhat e4下用gcc编译socket程序,(-lsocket无法使用啊)!急,在线等
  • 在python中的socket模块使用代理实例
  • linux socket的使用问题,请教
  • socket通讯使用select的问题
  • 使用tomcat出现的问题(socket write error),请教大家
  • 非阻塞socket该如何使用。。。
  • socket memcpy的使用
  • Linux下使用openssl api编程socket编程,为什么要编译啊?
  • 为什么socket程序使用gdb调试执行就接受不到数据了呢?
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • 怎样在使用curses字符串输出函数或字符输出函数时,隐藏光标 iis7站长之家
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • Python不使用print而直接输出二进制字符串
  • c#中SAPI使用总结——SpVoice的使用方法
  • Office 2010 Module模式下使用VBA Addressof
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3