亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

信號之system函數

2024-06-28 13:28:26
字體:
來源:轉載
供稿:網友
信號之system函數

在http://www.CUOXin.com/nufangrensheng/p/3512291.html中已經有了一個system函數的實現,但是該版本并不執行任何信號處理。POSIX.1要求system忽略SIGINT和SIGQUIT,阻塞SIGCHLD。

實例

程序清單10-19使用http://www.CUOXin.com/nufangrensheng/p/3512291.html中的system版本,用其調用ed(1)編輯器。(ed很久以來就是UNIX的組成部分。在這里調用它的原因是:它是捕捉中斷和退出信號的交互式程序。若 從shell調用ed,并鍵入中斷字符,則它捕捉中斷信號并打印問號。它還將對退出符的處理方式設置為忽略。

程序清單10-19 用system調用ed編輯器

#include "apue.h"static voidsig_int(int signo){    PRintf("caught SIGINT/n");}static voidsig_chld(int signo){    printf("caught SIGCHLD/n");}intmain(void){    if(signal(SIGINT, sig_int) == SIG_ERR)        err_sys("signal(SIGINT) error");    if(signal(SIGCHLD, sig_chld) == SIG_ERR)        err_sys("signal(SIGCHLD) error");    if(system("/bin/ed") < 0)        err_sys("system() error");    exit(0);}

程序清單10-19用于捕捉SIGINT和SIGCHLD信號。若調用它則可得:

未命名 

當編輯器終止時,系統向父進程(a.out進程)發送SIGCHLD信號。父進程捕捉它,然后從信號處理程序返回。但是若父進程正在捕捉SIGCHLD信號(因為它創建了子進程,所以應當這樣做以便了解它的子進程在何時終止),那么正在執行system函數時,應當阻塞對父進程遞送SIGCHLD信號。實際上,這就是POSIX.1所說明的。否則,當system創建的子進程結束時,system的調用者可能錯誤地認為,它自己的一個子進程結束了。于是,調用者將會調用一種wait函數以獲得子進程的終止狀態,這樣就阻止了system函數獲得子進程的終止狀態,并將其作為它的返回值。

如果再次執行該程序,在這次運行時將一個中斷信號傳送給編輯器,則可得:

未命名

鍵入中斷字符可使中斷信號傳送給前臺進程組中的所有進程。編輯程序正在運行時的各個進程的關系:

  登錄shell ---fork/exec---> a.out ---fork/exec---> /bin/sh ---fork/exec---> /bin/ed

  后臺進程組                                                        前臺進程組

a.out ---fork/exec---> /bin/sh 是由a.out中調用system函數引起的:http://www.CUOXin.com/nufangrensheng/p/3512291.html

/bin/sh ---fork/exec---> /bin/ed 可參考類shell程序的簡化實現程序清單1-5:http://www.CUOXin.com/nufangrensheng/p/3495129.html

在這一實例中,SIGINT被送給三個前臺進程(shell進程忽略此信號)。從輸出中可見a.out進程和ed進程捕捉該信號。但是,當用system運行另一程序(例如ed)時,不應使父子進程兩者都捕捉中斷產生的兩個信號:中斷和退出。這兩個信號只應送給正在運行的程序:子進程。因為由system執行的命令可能是交互式命令(例如本例中的ed程序),以及因為system的調用者在程序執行時放棄了控制,等待該執行程序的結束,所以system的調用者就不應接收這兩個終端產生的信號。這就是為什么POSIX.1規定system的調用者應當忽略這兩個信號的原因。(糊里糊涂的感覺)

實例

程序清單10-20 system函數的POSIX.1正確實現

#include <sys/wait.h>#include <errno.h>#include <signal.h>#include <unistd.h>intsystem(const char *cmdstring)    /* with appropriate signal handling */{    pid_t             pid;        int            status;    struct sigaction    ignore, saveintr, savequit;    sigset_t        chldmask, savemask;    if(cmdstring == NULL)        return(1);    /* always a command processor with UNIX */        ignore.sa_handler = SIG_IGN;    /* ignore SIGINT and SIGQUIT */    sigemptyset(&ignore.sa_mask);    ignore.sa_flags = 0;    if(sigaction(SIGINT, &ignore, &saveintr) < 0)        return(-1);    if(sigaction(SIGQUIT, &ignore, &savequit) < 0)        return(-1);    sigemptyset(&chldmask);        /* now block SIGCHLD */    sigaddset(&chldmask, SIGCHLD);    if(sigprocmask(SIG_BLOCK, &chldmask, &savemask) < 0)        return(-1);    if((pid = fork()) < 0)    {        status = -1;    /* probably out of processes */    }    else if(pid == 0)    {        /* restore previous signal actions & reset signal mask */        sigaction(SIGINT, &saveintr, NULL);        sigaction(SIGQUIT, &savequit, NULL);        sigprocmask(SIG_SETMASK, &savemask, NULL);         /* 在父進程中忽略SIGINT,SIGQUIT,阻塞SIGCHLD,在子進程中恢復 */        execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);        _exit(127);    /* exec error */     }    else    {        while(waitpid(pid, &status, 0) < 0)            if(errno != EINTR)            {                status = -1; /* error other than EINTR from waitpid() */                break;            }    }    /* restore previous signal actions & reset signal mask */    if(sigaction(SIGINT, &saveintr, NULL) < 0)        return(-1);    if(sigaction(SIGQUIT, &savequit, NULL) < 0)        return(-1);    if(sigprocmask(SIG_SETMASK, &savemask, NULL) < 0)        return(-1);                                           /* 子進程退出后,父進程才恢復SIGINT,SIGQUIT和SIGCHLD */    return(status);}

如果鏈接程序清單10-19與system函數的這一實現,那么所產生的二進制代碼與上一個有缺陷的程序相比較,存在如下差別:

(1)當我們鍵入中斷或退出字符時,不向調用者進程發送信號。

(2)當ed命令終止時,不向調用進程發送SIGCHLD信號。作為替代,在程序末尾的sigprocmask調用對SIGCHLD信號解除阻塞之前,SIGCHLD信號一直被阻塞。而對sigprocmask函數的這一次調用是在system函數調用waitpid取到子進程的終止狀態之后。

 

system的返回值

注意system的返回值,它是shell的終止狀態,但shell的終止狀態并不總是執行命令字符串進程的終止狀態。

Bourne shell有一個在其文檔中沒有說清楚的特性:當用一個信號終止了正在執行的命令時,其終止狀態是128加上一個信號編號。

用交互方式使用shell可以看到這一點:

未命名

在所使用的系統中,SIGINT的值為2,SIGQUIT的值為3,于是給出shell終止狀態130、131.

僅當shell本身異常終止時,system的返回值才報告一個異常終止。

在編寫使用system函數的程序時,一定要正確地解釋返回值。如果直接調用fork、exec和wait,則終止狀態與調用system是不同的。

 

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


上一篇:信號之sleep函數

下一篇:信號之abort函數

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲欧美另类中文| 亚洲欧美日韩直播| 国产精品福利久久久| 欧美床上激情在线观看| 成人精品一区二区三区电影黑人| 美女福利视频一区| 亚洲自拍欧美色图| 欧美国产日韩精品| 在线观看国产精品91| 粗暴蹂躏中文一区二区三区| 亚洲第一区在线观看| 米奇精品一区二区三区在线观看| 亚洲黄色在线观看| 国产美女91呻吟求| 欧美精品在线播放| 亚洲视频欧洲视频| 欧美一级高清免费播放| 国产精品网址在线| 亚洲一区亚洲二区| 久久久人成影片一区二区三区| 国产精品吊钟奶在线| 久久伊人精品视频| 亚洲成人久久久| 91高清视频在线免费观看| 97在线观看免费高清| 日韩动漫免费观看电视剧高清| 高清一区二区三区四区五区| 91精品国产91久久久| 日韩av有码在线| 性色av一区二区三区免费| 亚洲欧美制服丝袜| 主播福利视频一区| 中文字幕日韩在线观看| 亚洲人成在线免费观看| 欧美视频在线免费| 91大神在线播放精品| 国语自产精品视频在线看抢先版图片| 成人网在线观看| 亚洲精品视频久久| 国产精品国产福利国产秒拍| 国产精品观看在线亚洲人成网| 日韩精品视频观看| 91久久久久久久一区二区| 日本在线精品视频| 日韩精品电影网| 亚洲成人激情在线| 国产精品亚洲精品| 免费成人高清视频| 国内精品一区二区三区四区| 在线成人一区二区| 国产91九色视频| 亚洲第一网站男人都懂| 91在线观看免费观看| 国产精品 欧美在线| 九九热在线精品视频| 亚洲欧美激情四射在线日| 久久全国免费视频| 日韩福利视频在线观看| 国产一区二区三区在线免费观看| 久久久久久这里只有精品| 国产精品免费在线免费| 俺去啦;欧美日韩| 91av在线播放视频| 在线观看中文字幕亚洲| 色偷偷av一区二区三区| 国产激情综合五月久久| 午夜精品在线观看| 国产精品美女网站| 亚洲性无码av在线| 欧美黑人巨大精品一区二区| 中文字幕免费精品一区| 在线播放日韩精品| 日韩av网址在线观看| 亚洲欧美制服第一页| 91亚洲va在线va天堂va国| 成人精品在线视频| 蜜臀久久99精品久久久久久宅男| 国内免费精品永久在线视频| 亚洲高清一二三区| 4k岛国日韩精品**专区| 久久精品精品电影网| 最新国产精品拍自在线播放| 亚洲国产精品国自产拍av秋霞| 亚洲成人三级在线| 久久久久久久久久亚洲| 亚洲福利在线看| 不卡av在线网站| 97超碰蝌蚪网人人做人人爽| 尤物精品国产第一福利三区| 欧美肥臀大乳一区二区免费视频| 欧美三级欧美成人高清www| 欧美另类暴力丝袜| 美日韩丰满少妇在线观看| 久久影视电视剧免费网站清宫辞电视| 国产欧美精品一区二区| 亚洲色图偷窥自拍| 91国产精品视频在线| 亚州国产精品久久久| 国产精品入口尤物| 操91在线视频| 欧美久久精品一级黑人c片| 亚洲一区二区在线| 欧美性极品xxxx做受| 97热在线精品视频在线观看| 国产精品极品尤物在线观看| 97视频在线观看成人| 亚洲精品成人网| 欧美激情xxxx性bbbb| 久久夜色精品亚洲噜噜国产mv| 久久综合九色九九| 亚洲第一区第一页| 91成人在线视频| 久久久久久av| 色中色综合影院手机版在线观看| 欧美亚洲国产另类| 国产男人精品视频| 96精品久久久久中文字幕| 2019亚洲日韩新视频| 国产成人精品免费视频| 久久99青青精品免费观看| 国产日韩欧美中文在线播放| 免费91在线视频| 日韩视频在线观看免费| 国产精品中文字幕久久久| 国产97在线视频| 欧美日韩亚洲一区二区三区| 国产精品69精品一区二区三区| 91成人天堂久久成人| 欧美视频第一页| 欧洲精品在线视频| 欧美大尺度电影在线观看| 日本久久中文字幕| 欧美俄罗斯性视频| 国产大片精品免费永久看nba| 久久精品夜夜夜夜夜久久| 久久精彩免费视频| 91在线观看免费网站| 中文字幕在线精品| 91视频国产高清| 一区二区三区 在线观看视| 欧美另类69精品久久久久9999| 免费不卡欧美自拍视频| 午夜精品一区二区三区视频免费看| 欧美肥臀大乳一区二区免费视频| 欧美裸体视频网站| 国产精品扒开腿做爽爽爽视频| 韩国精品久久久999| 亚洲精品日产aⅴ| 日产精品久久久一区二区福利| 亚洲aaa激情| 精品久久中文字幕| 亚洲一区二区免费| 欧美精品在线网站| 国产成+人+综合+亚洲欧美丁香花| 欧美日韩午夜激情| 国产午夜精品视频免费不卡69堂| 国产日本欧美视频| 黑人精品xxx一区一二区| 亚洲综合精品伊人久久| 亚洲字幕在线观看| 成人动漫网站在线观看| 26uuu亚洲国产精品| 黑人巨大精品欧美一区免费视频| 国产精品视频最多的网站|