<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【轉】用alarm()為recvfrom設置定時器

      轉自:http://www.rzrgm.cn/dreamrun/p/4047795.html

        因為項目需要,需要以5s為周期,收集廣播信息,所以就要用到定時器和recvfrom函數,而在實用的過程中發現,5s到了,而程序仍然處于阻塞狀態,一直糾結了好久,才找到問題所在,在此mark一下,以備后期回顧。


        歸根結底,原因在于使用的signal()函數:signal()是重啟函數,超時以后會自動啟動已阻塞的函數,而不是中斷它的執行,如recvfrom,給人的感覺就是使用了alarm,但依然阻塞在了recvfrom上,不往下執行。但在中斷處理函數中用printf函數打印一條消息,就會發現,其實它是中斷過的,只是返回后又阻塞在了recvfrom上而已。
       
        而使用sigaction函數,可以設置是否要重啟函數,即alarmact.sa_flags = SA_NOMASK;選項,它會中斷已阻塞的函數,使程序繼續往下執行。而SA_RESTART選項則等同于signal效果,會重啟函數,阻塞在recvfrom上。

       
      #include <stdio.h>
      #include <string.h>
      #include <signal.h>
      #include <sys/socket.h>
      #include <errno.h>
      #include <netinet/in.h>
      
      int n;
      char recvbuf[1024];
      
      void listen_board();
      
      static void dealSigAlarm(int sigo)
      {
          n = -1;
          printf("alarm interrupt!\n");
          return;//just interrupt the recvfrom()
      }
      
      void main()
      {
      
          struct sigaction alarmact;
      
      
      //  signal(SIGALRM,dealSigAlarm);
      
          bzero(&alarmact,sizeof(alarmact));
          alarmact.sa_handler = dealSigAlarm;
      //  alarmact.sa_flags = SA_RESTART;
          alarmact.sa_flags = SA_NOMASK;
      
          sigaction(SIGALRM,&alarmact,NULL);
      
          listen_board();
      
      }
      void listen_board()
      {
          int sock;
          struct sockaddr_in fromaddr;
          int len = sizeof(struct sockaddr_in);
      
          bzero(&fromaddr,len);
          fromaddr.sin_family = AF_INET;
          fromaddr.sin_addr.s_addr = htonl(INADDR_ANY);
          fromaddr.sin_port = htons(9000);
      
          if((sock = socket(AF_INET,SOCK_DGRAM,0)) == -1 )
          {
              perror("socket create error.\n");
          }
      
          
          while(1)
          {
              alarm(5);
              n = recvfrom(sock,recvbuf,1024,0,(struct sockaddr *)&fromaddr,&len);
              if(n < 0)
              {
                  if(errno == EINTR)
                      printf("recvfrom timeout.\n");
                  else
                      printf("recvfrom error.\n");
              }
              else
                  alarm(0);
          }
      }

        按照上述程序運行,得到的結果如下圖所示(既調用了中斷函數,又終止了recvfrom函數):

        而設置為alarmact.sa_flags = SA_RESTART;選項時,結果如下圖(僅調用了中斷函數,卻阻塞在了recvfrom上,結果與使用signal()函數效果相同):


       另:信號處理流程:若設置了信號處理函數,當信號到達時,會將控制流轉向信號處理器。從信號處理器返回后,繼續執行原來的控制流。

      參考資料:http://liuzhigong.blog.163.com/blog/static/178272375201172021328123/

      posted @ 2020-02-14 09:11  菜鳥升級  閱讀(385)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久精品女人天堂av| 成人3D动漫一区二区三区| 久久精品国产精品第一区| 亚洲va久久久噜噜噜久久狠狠| 国产仑乱无码内谢| 女人腿张开让男人桶爽| 99久久精品久久久久久清纯| 日韩一区二区三区高清视频| 无码人妻斩一区二区三区| 99久久99久久久精品久久| 亚洲 欧美 综合 另类 中字| 开心五月激情综合久久爱| 肥臀浪妇太爽了快点再快点| 人人澡人摸人人添| 中文字幕国产精品第一页| 国产福利微视频一区二区| 无码国内精品人妻少妇| 国产又大又粗又爽的毛片| 亚洲国产免费图区在线视频| 亚洲色成人一区二区三区人人澡人人妻人人爽人人蜜桃麻豆 | 成人免费A级毛片无码片2022| 亚洲精品免费一二三区| 亚洲人妻一区二区精品| 中文字幕精品亚洲人成在线 | 成人午夜污一区二区三区| 成在线人永久免费视频播放 | 91密桃精品国产91久久| 男人的天堂av一二三区| 国产jjizz女人多水喷水| 亚洲av成人精品免费看| 人妻久久久一区二区三区| 强奷漂亮少妇高潮伦理| 欧美私人情侣网站| 91久久国产成人免费观看| 亚洲精品三区四区成人少| 广宗县| a级国产乱理伦片在线观看al| 欧美巨大极度另类| 久久婷婷大香萑太香蕉AV人| 日韩精品卡一卡二卡三卡四| 国产乱子影视频上线免费观看|