日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Linux被中斷的系統(tǒng)如何調(diào)用詳解

前言

成都創(chuàng)新互聯(lián)公司是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷策劃、微信小程序定制開(kāi)發(fā)、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開(kāi)發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立10余年以來(lái),已經(jīng)為近千家服務(wù)器托管各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的近千家客戶與我們一路同行,見(jiàn)證我們的成長(zhǎng);未來(lái),我們一起分享成功的喜悅。

慢系統(tǒng)調(diào)用,指的是可能永遠(yuǎn)無(wú)法返回,從而使進(jìn)程永遠(yuǎn)阻塞的系統(tǒng)調(diào)用,比如無(wú)客戶連接時(shí)的accept、無(wú)輸入時(shí)的read都屬于慢速系統(tǒng)調(diào)用。

在linux中,當(dāng)阻塞于某個(gè)慢系統(tǒng)調(diào)用的進(jìn)程捕獲一個(gè)信號(hào),則該系統(tǒng)調(diào)用就會(huì)被中斷,轉(zhuǎn)而執(zhí)行信號(hào)處理函數(shù),這就是被中斷的系統(tǒng)調(diào)用。

然而,當(dāng)信號(hào)處理函數(shù)返回時(shí),有可能發(fā)生以下的情況:

  • 如果信號(hào)處理函數(shù)是用signal注冊(cè)的,系統(tǒng)調(diào)用會(huì)自動(dòng)重啟,函數(shù)不會(huì)返回
  • 如果信號(hào)處理函數(shù)是用sigaction注冊(cè)的
    • 默認(rèn)情況下,系統(tǒng)調(diào)用不會(huì)自動(dòng)重啟,函數(shù)將返回失敗,同時(shí)errno被置為EINTR
    • 只有中斷信號(hào)的SA_RESTART標(biāo)志有效時(shí),系統(tǒng)調(diào)用才會(huì)自動(dòng)重啟

下面我們編寫(xiě)代碼,分別驗(yàn)證上述幾種情形,其中系統(tǒng)調(diào)用選擇read,中斷信號(hào)選擇SIGALRM,中斷信號(hào)由alarm產(chǎn)生。

使用signal

#include 
#include 
#include 
#include 

void handler(int s)
{
  printf("read is interrupt by signal handler\n");
  return;
}

int main()
{
  char buf[10];
  int nread = 0;

  signal(SIGALRM, handler);
  alarm(2);

  printf("read start\n");
  nread = read(STDIN_FILENO, buf, sizeof(buf));
  printf("read return\n");

  if ((nread < 0) && (errno == EINTR))
  {
    printf("read return failed, errno is EINTR\n");
  }

  return 0;
}

使用sigaction + 默認(rèn)情況

#include 
#include 
#include 
#include 

void handler(int s)
{
  printf("read is interrupt by signal handler\n");
  return;
}

int main()
{
  char buf[10];
  int nread = 0;
  struct sigaction act;

  sigemptyset(&act.sa_mask);
  act.sa_handler = handler;
  act.sa_flags = 0; //不給SIGALRM信號(hào)設(shè)置SA_RESTART標(biāo)志,使用sigaction的默認(rèn)處理方式
  //act.sa_flag |= SA_INTERRUPT; //SA_INTERRUPT是sigaction的默認(rèn)處理方式,即不自動(dòng)重啟被中斷的系統(tǒng)調(diào)用
  //實(shí)際上,不管act.sa_flags值為多少,只要不設(shè)置SA_RESTART,sigaction都是按SA_INTERRUPT處理的

  sigaction(SIGALRM, &act, NULL);
  alarm(2);

  printf("read start\n");
  nread = read(STDIN_FILENO, buf, sizeof(buf));
  printf("read return\n");

  if ((nread < 0) && (errno == EINTR))
  {
    printf("read return failed, errno is EINTR\n");
  }

  return 0;
}

使用sigaction + 指定SA_RESTART標(biāo)志

#include 
#include 
#include 
#include 

void handler(int s)
{
  printf("read is interrupt by signal handler\n");
  return;
}

int main()
{
  char buf[10];
  int nread = 0;
  struct sigaction act;

  sigemptyset(&act.sa_mask);
  act.sa_handler = handler;
  act.sa_flags = 0;
  act.sa_flags |= SA_RESTART; //給SIGALRM信號(hào)設(shè)置SA_RESTART標(biāo)志

  sigaction(SIGALRM, &act, NULL);
  alarm(2);

  printf("read start\n");
  nread = read(STDIN_FILENO, buf, sizeof(buf));
  printf("read return\n");

  if ((nread < 0) && (errno == EINTR))
  {
    printf("read return failed, errno is EINTR\n");
  }

  return 0;
}

由于對(duì)被中斷系統(tǒng)調(diào)用處理方式的差異性,因此對(duì)應(yīng)用程序來(lái)說(shuō),與被中斷的系統(tǒng)調(diào)用相關(guān)的問(wèn)題是:

  • 應(yīng)用程序無(wú)法保證總是知道信號(hào)處理函數(shù)的注冊(cè)方式,以及是否設(shè)置了SA_RESTART標(biāo)志
  • 可移植的代碼必須顯式處理關(guān)鍵函數(shù)的出錯(cuò)返回,當(dāng)函數(shù)出錯(cuò)且errno等于EINTR時(shí),可以根據(jù)實(shí)際需求進(jìn)行相應(yīng)處理,比如重啟該函數(shù)
int nread = read(fd, buf, 1024);

if (nread < 0)
{
  if (errno == EINTR)
  {
    //read被中斷,其實(shí)不應(yīng)該算作失敗,可以根據(jù)實(shí)際需求進(jìn)行處理,比如重寫(xiě)調(diào)用read,也可以忽略它
  }
  else
  {
    //read真正的讀錯(cuò)誤
  }
}

總結(jié)

本篇文章到此結(jié)束,如果您有相關(guān)技術(shù)方面疑問(wèn)可以聯(lián)系我們技術(shù)人員遠(yuǎn)程解決,感謝大家支持本站!

香港云服務(wù)器機(jī)房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪!


網(wǎng)頁(yè)名稱:Linux被中斷的系統(tǒng)如何調(diào)用詳解
文章鏈接:http://m.5511xx.com/article/cosspei.html