freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux環(huán)境進(jìn)程間通信(全)(編輯修改稿)

2025-07-16 14:14 本頁面
 

【文章內(nèi)容簡介】 親緣關(guān)系的進(jìn)程同樣可以采用先進(jìn)先出的通信機(jī)制進(jìn)行通信。管道和FIFO的數(shù)據(jù)是字節(jié)流,應(yīng)用程序之間必須事先確定特定的傳輸協(xié)議,采用傳播具有特定意義的消息。要靈活應(yīng)用管道及FIFO,理解它們的讀寫規(guī)則是關(guān)鍵。附1kill l 的運(yùn)行結(jié)果,顯示了當(dāng)前系統(tǒng)支持的所有信號: 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO30) SIGPWR 31) SIGSYS 32) SIGRTMIN 33) SIGRTMIN+134) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+538) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+942) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+1346) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX15 49) SIGRTMAX1450) SIGRTMAX13 51) SIGRTMAX12 52) SIGRTMAX11 53) SIGRTMAX1054) SIGRTMAX9 55) SIGRTMAX8 56) SIGRTMAX7 57) SIGRTMAX658) SIGRTMAX5 59) SIGRTMAX4 60) SIGRTMAX3 61) SIGRTMAX262) SIGRTMAX1 63) SIGRTMAX 除了在此處用來說明管道應(yīng)用外,接下來的專題還要對這些信號分類討論。附2對FIFO打開規(guī)則的驗(yàn)證(主要驗(yàn)證寫打開對讀打開的依賴性) include sys/include sys/include include define FIFO_SERVER /tmp/fifoserverint handle_client(char*)。main(int argc,char** argv){ int r_rd。 int w_fd。 pid_t pid。 if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)0)amp。amp。(errno!=EEXIST)) printf(cannot create fifoserver\n)。 handle_client(FIFO_SERVER)。 }int handle_client(char* arg){int ret。ret=w_open(arg)。switch(ret){ case 0: { printf(open %s error\n,arg)。 printf(no process has the fifo open for reading\n)。 return 1。 } case 1: { printf(something wrong with open the fifo except for ENXIO)。 return 1。 } case 1: { printf(open server ok\n)。 return 1。 } default: { printf(w_no_r return \n)。 return 0。 }} unlink(FIFO_SERVER)。}int w_open(char*arg)//0 open error for no reading//1 open error for other reasons//1 open ok{ if(open(arg,O_WRONLY|O_NONBLOCK,0)==1) { if(errno==ENXIO) { return 0。 } else return 1。 } return 1。 }二.Linux環(huán)境進(jìn)程間通信(二):信號(上)信號及信號來源 信號是在軟件層次上對中斷機(jī)制的一種模擬,在原理上,一個(gè)進(jìn)程收到一個(gè)信號與處理器收到一個(gè)中斷請求可以說是一樣的。信號是異步的,一個(gè)進(jìn)程不必通過任何操作來等待信號的到達(dá),事實(shí)上,進(jìn)程也不知道信號到底什么時(shí)候到達(dá)。信號是進(jìn)程間通信機(jī)制中唯一的異步通信機(jī)制,可以看作是異步通知,通知接收信號的進(jìn)程有哪些事情發(fā)生了。信號機(jī)制經(jīng)過POSIX實(shí)時(shí)擴(kuò)展后,功能更加強(qiáng)大,除了基本通知功能外,還可以傳遞附加信息。 信號事件的發(fā)生有兩個(gè)來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源,最常用發(fā)送信號的系統(tǒng)函數(shù)是kill, raise, alarm和setitimer以及sigqueue函數(shù),軟件來源還包括一些非法運(yùn)算等操作。信號的種類可以從兩個(gè)不同的分類角度對信號進(jìn)行分類:(1)可靠性方面:可靠信號與不可靠信號;(2)與時(shí)間的關(guān)系上:實(shí)時(shí)信號與非實(shí)時(shí)信號。在《Linux環(huán)境進(jìn)程間通信(一):管道及有名管道》的附1中列出了系統(tǒng)所支持的所有信號。不可靠信號 Linux信號機(jī)制基本上是從Unix系統(tǒng)中繼承過來的。早期Unix系統(tǒng)中的信號機(jī)制比較簡單和原始,后來在實(shí)踐中暴露出一些問題,因此,把那些建立在早期機(jī)制上的信號叫做不可靠信號,信號值小于SIGRTMIN(Red hat ,SIGRTMIN=32,SIGRTMAX=63)的信號都是不可靠信號。這就是不可靠信號的來源。它的主要問題是: 進(jìn)程每次處理信號后,就將對信號的響應(yīng)設(shè)置為默認(rèn)動作。在某些情況下,將導(dǎo)致對信號的錯(cuò)誤處理;因此,用戶如果不希望這樣的操作,那么就要在信號處理函數(shù)結(jié)尾再一次調(diào)用signal(),重新安裝該信號。 信號可能丟失,后面將對此詳細(xì)闡述。 因此,早期unix下的不可靠信號主要指的是進(jìn)程可能對信號做出錯(cuò)誤的反應(yīng)以及信號可能丟失。 Linux支持不可靠信號,但是對不可靠信號機(jī)制做了改進(jìn):在調(diào)用完信號處理函數(shù)后,不必重新調(diào)用該信號的安裝函數(shù)(信號安裝函數(shù)是在可靠機(jī)制上的實(shí)現(xiàn))。因此,Linux下的不可靠信號問題主要指的是信號可能丟失??煽啃盘?隨著時(shí)間的發(fā)展,實(shí)踐證明了有必要對信號的原始機(jī)制加以改進(jìn)和擴(kuò)充。所以,后來出現(xiàn)的各種Unix版本分別在這方面進(jìn)行了研究,力圖實(shí)現(xiàn)可靠信號。由于原來定義的信號已有許多應(yīng)用,不好再做改動,最終只好又新增加了一些信號,并在一開始就把它們定義為可靠信號,這些信號支持排隊(duì),不會丟失。同時(shí),信號的發(fā)送和安裝也出現(xiàn)了新版本:信號發(fā)送函數(shù)sigqueue()及信號安裝函數(shù)sigaction()。但是,POSIX只對可靠信號機(jī)制應(yīng)具有的功能以及信號機(jī)制的對外接口做了標(biāo)準(zhǔn)化,對信號機(jī)制的實(shí)現(xiàn)沒有作具體的規(guī)定。信號值位于SIGRTMIN和SIGRTMAX之間的信號都是可靠信號,可靠信號克服了信號可能丟失的問題。Linux在支持新版本的信號安裝函數(shù)sigation()以及信號發(fā)送函數(shù)sigqueue()的同時(shí),仍然支持早期的signal()信號安裝函數(shù),支持信號發(fā)送函數(shù)kill()。注:不要有這樣的誤解:由sigqueue()發(fā)送、sigaction安裝的信號就是可靠的。事實(shí)上,可靠信號是指后來添加的新信號(信號值位于SIGRTMIN及SIGRTMAX之間);不可靠信號是信號值小于SIGRTMIN的信號。信號的可靠與不可靠只與信號值有關(guān),與信號的發(fā)送及安裝函數(shù)無關(guān)。目前l(fā)inux中的signal()是通過sigation()函數(shù)實(shí)現(xiàn)的,因此,即使通過signal()安裝的信號,在信號處理函數(shù)的結(jié)尾也不必再調(diào)用一次信號安裝函數(shù)。同時(shí),由signal()安裝的實(shí)時(shí)信號支持排隊(duì),同樣不會丟失。對于目前l(fā)inux的兩個(gè)信號安裝函數(shù):signal()及sigaction()來說,它們都不能把SIGRTMIN以前的信號變成可靠信號(都不支持排隊(duì),仍有可能丟失,仍然是不可靠信號),而且對SIGRTMIN以后的信號都支持排隊(duì)。這兩個(gè)函數(shù)的最大區(qū)別在于,經(jīng)過sigaction安裝的信號都能傳遞信息給信號處理函數(shù)(對所有信號這一點(diǎn)都成立),而經(jīng)過signal安裝的信號卻不能向信號處理函數(shù)傳遞信息。對于信號發(fā)送函數(shù)來說也是一樣的。早期Unix系統(tǒng)只定義了32種信號,Ret ,編號063(SIGRTMIN=31,SIGRTMAX=63),將來可能進(jìn)一步增加,這需要得到內(nèi)核的支持。前32種信號已經(jīng)有了預(yù)定義值,每個(gè)信號有了確定的用途及含義,并且每種信號都有各自的缺省動作。如按鍵盤的CTRL ^C時(shí),會產(chǎn)生SIGINT信號,對該信號的默認(rèn)反應(yīng)就是進(jìn)程終止。后32個(gè)信號表示實(shí)時(shí)信號,等同于前面闡述的可靠信號。這保證了發(fā)送的多個(gè)實(shí)時(shí)信號都被接收。實(shí)時(shí)信號是POSIX標(biāo)準(zhǔn)的一部分,可用于應(yīng)用進(jìn)程。非實(shí)時(shí)信號都不支持排隊(duì),都是不可靠信號;實(shí)時(shí)信號都支持排隊(duì),都是可靠信號。進(jìn)程對信號的響應(yīng)進(jìn)程可以通過三種方式來響應(yīng)一個(gè)信號:(1)忽略信號,即對信號不做任何處理,其中,有兩個(gè)信號不能忽略:SIGKILL及SIGSTOP;(2)捕捉信號。定義信號處理函數(shù),當(dāng)信號發(fā)生時(shí),執(zhí)行相應(yīng)的處理函數(shù);(3)執(zhí)行缺省操作,Linux對每種信號都規(guī)定了默認(rèn)操作,詳細(xì)情況請參考[2]以及其它資料。注意,進(jìn)程對實(shí)時(shí)信號的缺省反應(yīng)是進(jìn)程終止。Linux究竟采用上述三種方式的哪一個(gè)來響應(yīng)信號,取決于傳遞給相應(yīng)API函數(shù)的參數(shù)。信號的發(fā)送發(fā)送信號的主要函數(shù)有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。kill() include sys/ include int kill(pid_t pid,int signo) 參數(shù)pid的值信號的接收進(jìn)程pid0進(jìn)程ID為pid的進(jìn)程pid=0同一個(gè)進(jìn)程組的進(jìn)程pid0 pid!=1進(jìn)程組ID為 pid的所有進(jìn)程pid=1除發(fā)送進(jìn)程自身外,所有進(jìn)程ID大于1的進(jìn)程Sinno是信號值,當(dāng)為0時(shí)(即空信號),實(shí)際不發(fā)送任何信號,但照常進(jìn)行錯(cuò)誤檢查,因此,可用于檢查目標(biāo)進(jìn)程是否存在,以及當(dāng)前進(jìn)程是否具有向目標(biāo)發(fā)送信號的權(quán)限(root權(quán)限的進(jìn)程可以向任何進(jìn)程發(fā)送信號,非root權(quán)限的進(jìn)程只能向?qū)儆谕粋€(gè)session或者同一個(gè)用戶的進(jìn)程發(fā)送信號)。Kill()最常用于pid0時(shí)的信號發(fā)送,調(diào)用成功返回 0; 否則,返回 1。注:對于pid0時(shí)的情況,對于哪些進(jìn)程將接受信號,各種版本說法不一,其實(shí)很簡單,參閱內(nèi)核源碼kernal/,上表中的規(guī)則是參考red hat 。raise() include int raise(int signo) 向進(jìn)程本身發(fā)送信號,參數(shù)為即將發(fā)送的信號值。調(diào)用成功返回 0;否則,返回 1。 sigqueue() include sys/ include int sigqueue(pid_t pid, int sig, const union sigval val) 調(diào)用成功返回 0;否則,返回 1。 sigqueue()是比較新的發(fā)送信號系統(tǒng)調(diào)用,主要是針對實(shí)時(shí)信號提出的(當(dāng)然也支持前32種),支持信號帶有參數(shù),與函數(shù)sigaction()配合使用。sigqueue的第一個(gè)參數(shù)是指定接收信號的進(jìn)程ID,第二個(gè)參數(shù)確定即將發(fā)送的信號,第三個(gè)參數(shù)是一個(gè)聯(lián)合數(shù)據(jù)結(jié)構(gòu)union sigval,指定了信號傳遞的參數(shù),即通常所說的4字節(jié)值。 typedef union sigval { int sival_int。 void *sival_ptr。 }sigval_t。sigqueue()比kill()傳遞了更多的附加信息,但sigqueue()只能向一個(gè)進(jìn)程發(fā)送信號,而不能發(fā)送信號給一個(gè)進(jìn)程組。如果signo=0,將會執(zhí)行錯(cuò)誤檢查,但實(shí)際上不發(fā)送任何信號,0值信號可用于檢查pid的有效性以及當(dāng)前進(jìn)程是否有權(quán)限向目標(biāo)進(jìn)程發(fā)送信號。在調(diào)用sigqueue時(shí),sigval_t指定的信息會拷貝到3參數(shù)信號處理函數(shù)(3參數(shù)信號處理函數(shù)指的是信號處理函數(shù)由sigaction安裝,并設(shè)定了sa_sigaction指針,稍后將闡述)的siginfo_t結(jié)構(gòu)中,這樣信號處理函數(shù)就可以處理這些信息了。由于sigqueue系統(tǒng)調(diào)用支持發(fā)送帶參數(shù)信號,所以比kill()系統(tǒng)調(diào)用的功能要靈活和強(qiáng)大得多。注:sigqueue()發(fā)送非實(shí)時(shí)信號時(shí),第三個(gè)參數(shù)包含的信息仍然能夠傳遞給信號處理函數(shù); sigqueue()發(fā)送非實(shí)時(shí)信號時(shí),仍然不支持排隊(duì),即在信號處理函數(shù)執(zhí)行過程中到來的所有相同信號,都被合并為一個(gè)信號。alarm() include unsigned int alarm(unsigned int seconds) 專門為SIGALRM信號而設(shè),在指定的時(shí)間seconds秒后,將向進(jìn)程本身發(fā)送SIGALRM信號,又稱為鬧鐘時(shí)間。進(jìn)程調(diào)用alarm后,任何以前的alarm()調(diào)用都將無效。如果參數(shù)seconds為零,那么進(jìn)
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1