青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 200, comments - 8, trackbacks - 0, articles - 0

早期的Unix系統(tǒng),如果進(jìn)程在一個‘慢’系統(tǒng)調(diào)用中阻塞時,捕獲到一個信號,這個系統(tǒng)調(diào)用被中斷,調(diào)用返回錯誤,設(shè)置errno為EINTR。系統(tǒng)調(diào)用被分為慢系統(tǒng)調(diào)用和其他兩大類別。

    慢系統(tǒng)調(diào)用可以被永久阻塞,包括以下幾個類別

       (1)讀寫‘慢’設(shè)備(包括pipe,終端設(shè)備,網(wǎng)絡(luò)連接等)。讀時,數(shù)據(jù)不存在,需要等待;寫時,緩沖區(qū)滿或其他原因,需要等待。讀寫磁盤文件一般不會阻塞。

       (2)當(dāng)打開某些特殊文件時,需要等待某些條件,才能打開。例如:打開中斷設(shè)備時,需要等到連接設(shè)備的modem響應(yīng)才能完成。

       (3)pause和wait函數(shù)。pause函數(shù)使調(diào)用進(jìn)程睡眠,直到捕獲到一個信號。wait等待子進(jìn)程終止。

       (4)某些ioctl操作。

       (5)某些IPC操作。

    有些情況下,即使操作被信號中斷,還是要繼續(xù)執(zhí)行該操作,即需要重啟該操作。那么,程序需要檢查系統(tǒng)調(diào)用的錯誤類型是否為EINTR,如果是,表明系統(tǒng)調(diào)用被中斷,則重新啟動操作。典型代碼如下所示:

     again:
          if ((n = read(fd, buf, BUFFSIZE)) < 0) {
             if (errno == EINTR)
                  goto again;     /* just an interrupted system call */
            /* handle other errors */
          }

    4.2BSD為了簡化程序的操作,提供了自動重啟某些被中斷系統(tǒng)調(diào)用的功能,這些系統(tǒng)調(diào)用包括ioctl,read,readv,write,writev,wait,waitpid。前五個函數(shù)當(dāng)它們操作慢設(shè)備時,才會被中斷。這可能給那些不希望自動重啟這些系統(tǒng)調(diào)用的應(yīng)用帶來麻煩,所以4.3BSD允許進(jìn)程在指定信號上關(guān)閉此功能。

    POSIX.1允許實(shí)現(xiàn)重新啟動系統(tǒng)調(diào)用,但沒有強(qiáng)制要求。SUS給sigaction增加了一個XSI擴(kuò)展標(biāo)記SA_RESTART,要求被該信號中斷的系統(tǒng)調(diào)用被自動重啟。

 

別忘了--要處理被中斷的系統(tǒng)調(diào)用

一般慢速系統(tǒng)調(diào)用基本規(guī)則是:當(dāng)阻塞于某個慢系統(tǒng)系統(tǒng)調(diào)用的一個進(jìn)程捕獲某個信號且相應(yīng)信號處理函數(shù)返回時,該系統(tǒng)調(diào)用可能要返回

ENINTR錯誤。

 

問:linux會重啟某些被中斷的系統(tǒng)調(diào)用嗎?

 

處理的例子:

for( ; ;) {
     if (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) 
    {
    if (errno == EINTR)
        continue;
    }
    else
    {
        errsys("accept error");
    }
}

 

在tcp socket 中,connect()被中斷后是不能被重啟的?如何處理呢

可以采用select來等待連接完成

 

系統(tǒng)調(diào)用被信號中斷和自動重啟動

    當(dāng)進(jìn)程正在執(zhí)行一個系統(tǒng)調(diào)用時,如果被信號中斷,這時會發(fā)生什么呢?

當(dāng)一個低速調(diào)用阻塞期間捕捉到一個信號, 則該系統(tǒng)調(diào)用就被中斷不再繼續(xù)執(zhí)行。 該系統(tǒng)調(diào)用返回出錯,起errono設(shè)置為EINTR。 因?yàn)榘l(fā)生信號, 進(jìn)程捕捉到它, 這將是一個很好的機(jī)會來喚醒阻塞的系統(tǒng)調(diào)用。

但有一個問題就是如果該系統(tǒng)調(diào)為read(), 正在等待終端輸入, 如果被信號中斷的話, 難免會影響整個程序的正確性, 所以有些系統(tǒng)使這類系統(tǒng)調(diào)用自動重啟動。就是一旦被某信號中斷, 立即再啟動。

如下面的signal1函數(shù)實(shí)現(xiàn): 

#include <signal.h>
#include "ourhdr.h"

typedef void Sigfunc(int);

Sigfunc *
signal1(int signo, Sigfunc *func)
{
struct sigaction        act, oact;

act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;

if (signo ==SIGALRM)
{
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
}
else
{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;   /*這里對所有的信號都設(shè)置了自動再啟動,唯獨(dú)沒有SIGALRM*/
#endif
}

if (sigaction(signo, &act, &oact)<0)
return(SIG_ERR);
return (oact.sa_handler);
}

為什么偏偏面對SIGALRM信號, 系統(tǒng)調(diào)用不設(shè)置自動重啟動呢? 這時為了我們方便給read等低速系統(tǒng)調(diào)用定時。 我們不希望它一遇到某個信號變自動重啟動,也不希望它無限制的阻塞下去。 于是用alarm()進(jìn)行定時, 一旦超出某個時間, 便被ALRM信號中斷喚醒,且不再重啟動。


下面這段程序用來測試上面的signal1函數(shù), 對一個read系統(tǒng)調(diào)用, 如何給它定時的:

#include <signal.h>
#include "ourhdr.h"
#include "10-12.c"

#define MAXLINE 1024

static void sig_alrm(int);

int
main(void)
{
int     n;
char line[MAXLINE];

if (signal1(SIGALRM, sig_alrm) == SIG_ERR)
perror("signal");

alarm(10);
if ( (n = read(STDIN_FILENO, line, MAXLINE)) < 0)
perror("read");
alarm(0);
write(STDOUT_FILENO, line, n);
write(STDOUT_FILENO, "exit\n", 5);

exit(0);
}

static void
sig_alrm(int signo)
{
write(STDOUT_FILENO, "recieved signal -ALRM\n", 22);
return;
}

在我的系統(tǒng)中, 如果調(diào)用默認(rèn)的signal函數(shù), 該read()系統(tǒng)調(diào)用將會自動重啟動, 所謂的alarm定時也就不起作用了。

Feedback

# re: 慢系統(tǒng)調(diào)用與信號中斷(轉(zhuǎn))  回復(fù)  更多評論   

2013-01-18 23:59 by kangear
學(xué)習(xí)了,不過都是搞得這么神秘,這個信號是怎么來的,誰發(fā)的,把它揪出來。

# re: 慢系統(tǒng)調(diào)用與信號中斷(轉(zhuǎn))  回復(fù)  更多評論   

2013-04-02 17:13 by 鑫龍
信號是由內(nèi)核發(fā)出給你寫的程序的~@kangear
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品视频在线观看| 美女久久一区| 亚洲欧美成人综合| 亚洲第一精品夜夜躁人人爽| 一区二区av| 欧美国产亚洲另类动漫| 在线观看视频免费一区二区三区| 午夜日本精品| 亚洲一区中文字幕在线观看| 欧美午夜精品理论片a级按摩| 亚洲欧洲一区二区在线播放| 欧美大片一区二区| 免费久久精品视频| 日韩一级大片在线| 亚洲精品一区二区三区婷婷月| 美女任你摸久久| 亚洲欧洲偷拍精品| 亚洲精品乱码久久久久久| 欧美成人午夜| 亚洲视频碰碰| 亚洲视频免费在线观看| 欧美国产日产韩国视频| 欧美黄色一级视频| 中文一区在线| 亚洲欧美电影院| 一区二区三区在线免费播放| 免费观看久久久4p| 欧美理论视频| 亚洲综合成人在线| 欧美一级专区免费大片| 激情综合电影网| 亚洲区免费影片| 国产精品永久入口久久久| 久久久精品一区| 欧美高清在线精品一区| 亚洲尤物精选| 久久久精品免费视频| 99视频精品在线| 亚洲欧美综合网| 在线免费日韩片| 日韩一级不卡| 国产一区二区三区av电影| 欧美激情aaaa| 国产精品一二一区| 欧美国产日本高清在线| 国产精品美女久久| 欧美va天堂| 国产精品久久夜| 欧美岛国激情| 国产视频不卡| 亚洲精品在线观看免费| 国产伪娘ts一区| 一区二区三区在线不卡| 一本久道久久综合婷婷鲸鱼| 激情五月婷婷综合| 亚洲视频1区2区| 亚洲精品久久久久久下一站| 欧美亚洲系列| 亚洲女人天堂成人av在线| 久久在线视频| 久久99伊人| 欧美午夜久久久| 亚洲国产人成综合网站| 国产自产2019最新不卡| 欧美一区二区三区久久精品| 欧美激情一区二区三区成人| 久久精品一区二区三区不卡牛牛 | 久久精品国产亚洲精品 | 99精品热6080yy久久| 亚洲欧美一区二区三区久久| 亚洲美女在线视频| 久久久www成人免费无遮挡大片 | 欧美有码在线观看视频| 欧美激情a∨在线视频播放| 久久久水蜜桃| 国产精品视频不卡| 一本一本a久久| 99国产精品99久久久久久粉嫩 | 国产精品久久夜| 亚洲三级电影在线观看| 亚洲国产精品一区二区第一页 | 亚洲综合电影| 亚洲一区二区三区四区五区黄 | 亚洲欧洲另类国产综合| 欧美诱惑福利视频| 欧美在线视频免费| 国产欧美视频一区二区| 91久久综合亚洲鲁鲁五月天| 欧美在线视屏| 久久xxxx精品视频| 国产日本欧美一区二区| 午夜精品久久久久久久久 | 久久大逼视频| 久久在线免费观看视频| 国产日韩亚洲| 久久九九热re6这里有精品| 久久久人人人| 亚洲国产经典视频| 欧美精品亚洲二区| 9l视频自拍蝌蚪9l视频成人| 亚洲在线观看视频网站| 国产精品久久99| 亚洲欧美在线aaa| 久久一区精品| 亚洲欧洲日韩女同| 欧美日韩一区二区三区在线视频 | 亚洲国产裸拍裸体视频在线观看乱了| 一区精品久久| 欧美电影在线| 一区二区三区欧美视频| 欧美一区二区三区在线看| 国产亚洲一本大道中文在线| 久久精品五月婷婷| 亚洲卡通欧美制服中文| 欧美巨乳在线观看| 亚洲图片在线| 久久久久一区二区三区| 国产亚洲亚洲| 欧美www视频在线观看| 亚洲日本成人网| 欧美在线观看天堂一区二区三区| 黄色日韩网站视频| 欧美久久一级| 亚洲欧美日韩中文视频| 久久综合99re88久久爱| 亚洲看片一区| 国产欧美婷婷中文| 久久免费高清视频| 日韩午夜在线电影| 久久久免费精品| 亚洲小说区图片区| 激情小说另类小说亚洲欧美| 欧美日韩第一区日日骚| 欧美一区二区日韩| 亚洲欧洲精品成人久久奇米网| 欧美一区二区在线播放| 日韩一级在线| 亚洲第一精品电影| 国产老肥熟一区二区三区| 欧美本精品男人aⅴ天堂| 欧美亚洲视频在线看网址| 亚洲精品影院在线观看| 可以看av的网站久久看| 亚洲欧美国产视频| 日韩视频中文字幕| 禁久久精品乱码| 国产精品视频久久| 欧美日本在线视频| 久久视频一区二区| 性色一区二区| 亚洲小少妇裸体bbw| 欧美激情欧美激情在线五月| 久久九九国产精品怡红院| 亚洲一区在线视频| 中文国产亚洲喷潮| 日韩午夜免费视频| 亚洲精品乱码久久久久久按摩观| 含羞草久久爱69一区| 国产精品一区二区三区四区五区| 欧美日韩精品系列| 欧美精品一区二区三区蜜臀| 久久亚洲精品网站| 久久9热精品视频| 小黄鸭精品密入口导航| 亚洲一区日韩在线| 在线亚洲+欧美+日本专区| 亚洲乱码国产乱码精品精| 亚洲国产精品精华液2区45| 欧美99久久| 欧美阿v一级看视频| 蜜桃久久av| 久久精品卡一| 久久久在线视频| 久久久久国产精品www| 久久爱另类一区二区小说| 欧美一区二区三区视频免费播放 | 免费在线亚洲| 免费观看日韩| 欧美大片91| 亚洲欧洲精品一区二区三区不卡 | 欧美激情一二三区| 欧美国产亚洲视频| 亚洲国产91精品在线观看| 亚洲国产婷婷香蕉久久久久久| 亚洲福利专区| 亚洲国产经典视频| 亚洲精品久久久久久久久久久久久| 亚洲国产精品成人精品| 亚洲精品影视在线观看| 一区二区三区免费看| 亚洲一区二区三区乱码aⅴ| 欧美一区二区三区免费大片| 久久综合给合久久狠狠色| 欧美国产日韩精品| 亚洲精品欧美一区二区三区| 亚洲先锋成人| 久久综合九色| 欧美视频观看一区| 狠狠爱成人网| 一区二区三区久久久|