Linux被中斷的系統(tǒng)如何調(diào)用詳解-創(chuàng)新互聯(lián)

前言

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于做網(wǎng)站、成都做網(wǎng)站、永州網(wǎng)絡推廣、微信小程序開發(fā)、永州網(wǎng)絡營銷、永州企業(yè)策劃、永州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供永州建站搭建服務,24小時服務熱線:18980820575,官方網(wǎng)址:muchs.cn

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


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


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

  • 如果信號處理函數(shù)是用signal注冊的,系統(tǒng)調(diào)用會自動重啟,函數(shù)不會返回
  • 如果信號處理函數(shù)是用sigaction注冊的
    • 默認情況下,系統(tǒng)調(diào)用不會自動重啟,函數(shù)將返回失敗,同時errno被置為EINTR
    • 只有中斷信號的SA_RESTART標志有效時,系統(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;
}

當前標題:Linux被中斷的系統(tǒng)如何調(diào)用詳解-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://muchs.cn/article6/dejpig.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站網(wǎng)頁設計公司、標簽優(yōu)化網(wǎng)站策劃、電子商務手機網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化