最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux被中斷的系統(tǒng)如何調(diào)用詳解

 更新時間:2019年10月12日 08:23:11   作者:原野追逐  
這篇文章主要給大家介紹了關(guān)于Linux被中斷的系統(tǒng)如何調(diào)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Linux具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

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

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

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

使用signal

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

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 <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

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信號設(shè)置SA_RESTART標(biāo)志,使用sigaction的默認(rèn)處理方式
  //act.sa_flag |= SA_INTERRUPT; //SA_INTERRUPT是sigaction的默認(rèn)處理方式,即不自動重啟被中斷的系統(tǒng)調(diào)用
  //實際上,不管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 <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

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信號設(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;
}


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

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 一次Linux修改MySQL配置不生效的問題解決

    一次Linux修改MySQL配置不生效的問題解決

    這篇文章主要給大家介紹了關(guān)于Linux修改MySQL配置不生效問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Linux系統(tǒng)具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • LNMP下FTP服務(wù)器的安裝與使用方法(Pureftpd和Proftpd)

    LNMP下FTP服務(wù)器的安裝與使用方法(Pureftpd和Proftpd)

    FTP是網(wǎng)站文件維護(hù)中使用比較多的,目前LNMP一鍵安裝包中有Pureftpd和Proftpd服務(wù)器安裝腳本
    2013-06-06
  • 系統(tǒng)講解Apache Kafka消息管理與異常處理的最佳實踐

    系統(tǒng)講解Apache Kafka消息管理與異常處理的最佳實踐

    Apache Kafka 作為分布式流處理平臺的核心組件,廣泛應(yīng)用于實時數(shù)據(jù)管道、日志聚合和事件驅(qū)動架構(gòu),下面我們就來系統(tǒng)講解 Kafka 消息管理與異常處理的最佳實踐吧
    2025-04-04
  • Linux 服務(wù)器安全配置

    Linux 服務(wù)器安全配置

    Linux 服務(wù)器安全配置,需要的朋友可以參考下
    2012-03-03
  • Linux系統(tǒng)中卸載與安裝JDK的詳細(xì)教程

    Linux系統(tǒng)中卸載與安裝JDK的詳細(xì)教程

    本文詳細(xì)介紹了如何在Linux系統(tǒng)中通過Xshell和Xftp工具連接與傳輸文件,然后進(jìn)行JDK的安裝與卸載,安裝步驟包括連接Linux、傳輸JDK安裝包、解壓并配置環(huán)境變量,卸載過程則涉及查找JDK路徑、刪除文件及更新環(huán)境變量,需要的朋友可以參考下
    2025-04-04
  • apache提示Failed loading ZendLoader.dll解決方法

    apache提示Failed loading ZendLoader.dll解決方法

    這篇文章主要介紹了apache提示Failed loading ZendLoader.dll解決方法,需要的朋友可以參考下
    2015-04-04
  • CentOS 6 啟動流程詳細(xì)介紹

    CentOS 6 啟動流程詳細(xì)介紹

    這篇文章主要介紹了CentOS 6 啟動流程詳細(xì)介紹的相關(guān)資料,這里對centos 啟動進(jìn)行了分析,希望能幫助到大家理解centos 啟動流程,需要的朋友可以參考下
    2017-07-07
  • Linux 字符設(shè)備驅(qū)動框架詳細(xì)介紹

    Linux 字符設(shè)備驅(qū)動框架詳細(xì)介紹

    這篇文章主要介紹了Linux 字符設(shè)備驅(qū)動框架詳細(xì)介紹的相關(guān)資料,字符設(shè)備就是字節(jié)流形式通訊的I/O設(shè)備,絕大部分設(shè)備都是字符設(shè)備,這里提供簡單的實例,需要的朋友可以參考下
    2016-12-12
  • Linux修改主機名(hostname)的兩種方法(親測可用)

    Linux修改主機名(hostname)的兩種方法(親測可用)

    要想在虛擬機的 Linux 系統(tǒng)內(nèi)部改變主機名(hostname),需要通過系統(tǒng)的配置來修改,在大多數(shù)基于 Red Hat 的 Linux 發(fā)行版(比如 CentOS、Fedora)中,本文小編給大家介紹了;兩種修改主機名的方法,感興趣的小伙伴跟著小編一起來看看吧
    2023-11-11
  • Apache配置域名跳轉(zhuǎn)的詳細(xì)步驟

    Apache配置域名跳轉(zhuǎn)的詳細(xì)步驟

    域名跳轉(zhuǎn)就是實現(xiàn)URL的跳轉(zhuǎn)和隱藏真實地址,基于Perl語言的正則表達(dá)式規(guī)范,平時幫助我們實現(xiàn)擬靜態(tài),擬目錄,域名跳轉(zhuǎn),防止盜鏈等,本文小編給大家介紹了Apache配置域名跳轉(zhuǎn)的詳細(xì)步驟,需要的朋友可以參考下
    2025-04-04

最新評論

淳化县| 璧山县| 四会市| 伊金霍洛旗| 镇巴县| 黄大仙区| 五大连池市| 昭通市| 紫云| 四子王旗| 原阳县| 丹江口市| 辉县市| 葫芦岛市| 太仆寺旗| 荃湾区| 宜州市| 毕节市| 银川市| 宝兴县| 鹤峰县| 闽侯县| 台南市| 西华县| 运城市| 浪卡子县| 遵义县| 江门市| 大同市| 石渠县| 淮滨县| 广灵县| 凌云县| 河曲县| 荥经县| 承德市| 湘阴县| 芷江| 松潘县| 饶阳县| 砀山县|