《Linux基礎》電子課件
《Linux基礎》電子課件,Linux基礎,Linux,基礎,電子,課件
文件IO操作概述本講大綱:文件描述符文件描述符文件描述符文件描述符簡簡介介介介數(shù)數(shù)數(shù)數(shù)據(jù)流據(jù)流據(jù)流據(jù)流概概概概述述述述文件描述符簡介 在在LinuxLinux系統(tǒng)中,文件系統(tǒng)中,文件I/OI/O操作可以分為兩類,一類是基于文件描述操作可以分為兩類,一類是基于文件描述符的符的I/OI/O操作,還有一類是基于數(shù)據(jù)流的操作,還有一類是基于數(shù)據(jù)流的I/OI/O操作。在對這兩類操作。在對這兩類I/OI/O操作講操作講解之前,先來熟悉一下文件描述符和數(shù)據(jù)流這些基本概念。解之前,先來熟悉一下文件描述符和數(shù)據(jù)流這些基本概念。10.1.1 10.1.1 文件描述符文件描述符簡簡介介 在文件操作一章中,也經(jīng)常提到文件描述符這個概念,所謂的文件在文件操作一章中,也經(jīng)常提到文件描述符這個概念,所謂的文件描述符,就是進程與打開的文件的一個橋梁,通過這個橋梁,才可以在描述符,就是進程與打開的文件的一個橋梁,通過這個橋梁,才可以在 進程中對這個文件進行讀寫等操作。進程中對這個文件進行讀寫等操作。在在LinuxLinux環(huán)境下,每打開一個磁盤文件時,都會在內(nèi)核中建立一個文環(huán)境下,每打開一個磁盤文件時,都會在內(nèi)核中建立一個文件表項,文件表項中存儲著文件的狀態(tài)信息、存儲文件內(nèi)容的緩沖區(qū)和件表項,文件表項中存儲著文件的狀態(tài)信息、存儲文件內(nèi)容的緩沖區(qū)和當前文件的讀寫位置。如果同一個磁盤文件打開了當前文件的讀寫位置。如果同一個磁盤文件打開了3 3次,會創(chuàng)建次,會創(chuàng)建3 3個這樣個這樣的文件表項(的文件表項(a a、b b和和c c),讀寫該文件時,只會改變該文件表項中的文件),讀寫該文件時,只會改變該文件表項中的文件讀寫位置。這讀寫位置。這3 3個文件表項存儲在一個文件表數(shù)組個文件表項存儲在一個文件表數(shù)組table3table3中,在這里中,在這里table0=atable0=a,table1=btable1=b,table2=ctable2=c。這個文件表的下標就稱之為文。這個文件表的下標就稱之為文件描述符,將這個文件描述符存儲在一個數(shù)組中件描述符,將這個文件描述符存儲在一個數(shù)組中des3=0,1,2des3=0,1,2,那么在,那么在進程中,就可以通過這個進程中,就可以通過這個desdes數(shù)組下標引用文件表項。也就是通過文件描數(shù)組下標引用文件表項。也就是通過文件描述符就可以訪問到這個磁盤文件。述符就可以訪問到這個磁盤文件。數(shù)據(jù)流概述10.1.2 10.1.2 數(shù)數(shù)據(jù)流據(jù)流概概述述 從數(shù)據(jù)操作方式這個角度來說,從數(shù)據(jù)操作方式這個角度來說,從數(shù)據(jù)操作方式這個角度來說,從數(shù)據(jù)操作方式這個角度來說,LinuxLinuxLinuxLinux系統(tǒng)中的文件(無論是普通文件還是設備系統(tǒng)中的文件(無論是普通文件還是設備系統(tǒng)中的文件(無論是普通文件還是設備系統(tǒng)中的文件(無論是普通文件還是設備文件)可以看作是數(shù)據(jù)流。對文件進行操作之前必須先調用標準文件)可以看作是數(shù)據(jù)流。對文件進行操作之前必須先調用標準文件)可以看作是數(shù)據(jù)流。對文件進行操作之前必須先調用標準文件)可以看作是數(shù)據(jù)流。對文件進行操作之前必須先調用標準I/OI/OI/OI/O庫函數(shù)庫函數(shù)庫函數(shù)庫函數(shù)fopen()fopen()fopen()fopen()將數(shù)據(jù)流打開。打開數(shù)據(jù)流之后,就可以對數(shù)據(jù)流進行輸入輸出的操作。將數(shù)據(jù)流打開。打開數(shù)據(jù)流之后,就可以對數(shù)據(jù)流進行輸入輸出的操作。將數(shù)據(jù)流打開。打開數(shù)據(jù)流之后,就可以對數(shù)據(jù)流進行輸入輸出的操作。將數(shù)據(jù)流打開。打開數(shù)據(jù)流之后,就可以對數(shù)據(jù)流進行輸入輸出的操作。標準標準標準標準I/OI/OI/OI/O庫函數(shù)是庫函數(shù)是庫函數(shù)是庫函數(shù)是C C C C語言中所特有的用于高級接口的函數(shù),這些庫函數(shù)存放在語言中所特有的用于高級接口的函數(shù),這些庫函數(shù)存放在語言中所特有的用于高級接口的函數(shù),這些庫函數(shù)存放在語言中所特有的用于高級接口的函數(shù),這些庫函數(shù)存放在C C C C語言的語言的語言的語言的stdio.hstdio.hstdio.hstdio.h頭文件中,因此這些用于數(shù)據(jù)流的頭文件中,因此這些用于數(shù)據(jù)流的頭文件中,因此這些用于數(shù)據(jù)流的頭文件中,因此這些用于數(shù)據(jù)流的I/OI/OI/OI/O操作函數(shù)不僅適用于操作函數(shù)不僅適用于操作函數(shù)不僅適用于操作函數(shù)不僅適用于LinuxLinuxLinuxLinux系統(tǒng),系統(tǒng),系統(tǒng),系統(tǒng),還適用于其他的操作系統(tǒng),由此可見,此庫函數(shù)的應用大大增加了程序的移植性。還適用于其他的操作系統(tǒng),由此可見,此庫函數(shù)的應用大大增加了程序的移植性。還適用于其他的操作系統(tǒng),由此可見,此庫函數(shù)的應用大大增加了程序的移植性。還適用于其他的操作系統(tǒng),由此可見,此庫函數(shù)的應用大大增加了程序的移植性。要對數(shù)據(jù)流進行讀寫操作時,需要標準要對數(shù)據(jù)流進行讀寫操作時,需要標準要對數(shù)據(jù)流進行讀寫操作時,需要標準要對數(shù)據(jù)流進行讀寫操作時,需要標準I/OI/OI/OI/O庫函數(shù)和庫函數(shù)和庫函數(shù)和庫函數(shù)和FILEFILEFILEFILE類型的文件指針一起來類型的文件指針一起來類型的文件指針一起來類型的文件指針一起來實現(xiàn)。這個文件指針是打開流時返回的指針,該指針用來表示要操作的數(shù)據(jù)流。實現(xiàn)。這個文件指針是打開流時返回的指針,該指針用來表示要操作的數(shù)據(jù)流。實現(xiàn)。這個文件指針是打開流時返回的指針,該指針用來表示要操作的數(shù)據(jù)流。實現(xiàn)。這個文件指針是打開流時返回的指針,該指針用來表示要操作的數(shù)據(jù)流。當執(zhí)行程序時,有當執(zhí)行程序時,有當執(zhí)行程序時,有當執(zhí)行程序時,有3 3 3 3個數(shù)據(jù)流不需要特定的函數(shù)進行打開的操作,它們會自動打開,個數(shù)據(jù)流不需要特定的函數(shù)進行打開的操作,它們會自動打開,個數(shù)據(jù)流不需要特定的函數(shù)進行打開的操作,它們會自動打開,個數(shù)據(jù)流不需要特定的函數(shù)進行打開的操作,它們會自動打開,這這這這3 3 3 3個流是標準輸入、標準輸出和標準錯誤輸出。這個流是標準輸入、標準輸出和標準錯誤輸出。這個流是標準輸入、標準輸出和標準錯誤輸出。這個流是標準輸入、標準輸出和標準錯誤輸出。這3 3 3 3個數(shù)據(jù)流是自動打開的,當不個數(shù)據(jù)流是自動打開的,當不個數(shù)據(jù)流是自動打開的,當不個數(shù)據(jù)流是自動打開的,當不使用時,也會自動關閉。使用時,也會自動關閉。使用時,也會自動關閉。使用時,也會自動關閉。然而調用標準然而調用標準然而調用標準然而調用標準I/OI/OI/OI/O庫函數(shù)庫函數(shù)庫函數(shù)庫函數(shù)fopen()fopen()fopen()fopen()打開的數(shù)據(jù)流,在對流進行操作后,需要調用打開的數(shù)據(jù)流,在對流進行操作后,需要調用打開的數(shù)據(jù)流,在對流進行操作后,需要調用打開的數(shù)據(jù)流,在對流進行操作后,需要調用函數(shù)函數(shù)函數(shù)函數(shù)fclose()fclose()fclose()fclose()將其關閉,將其關閉,將其關閉,將其關閉,fclose()fclose()fclose()fclose()函數(shù)在關閉數(shù)據(jù)流之前,會清空在操作過程中分配函數(shù)在關閉數(shù)據(jù)流之前,會清空在操作過程中分配函數(shù)在關閉數(shù)據(jù)流之前,會清空在操作過程中分配函數(shù)在關閉數(shù)據(jù)流之前,會清空在操作過程中分配的緩沖區(qū),并且會保存數(shù)據(jù)信息。的緩沖區(qū),并且會保存數(shù)據(jù)信息。的緩沖區(qū),并且會保存數(shù)據(jù)信息。的緩沖區(qū),并且會保存數(shù)據(jù)信息。標題基于文件描述符的IO操作本講大綱:文件的打文件的打文件的打文件的打開與關開與關開與關開與關閉閉文件的文件的文件的文件的讀讀寫寫寫寫操作操作操作操作文件的定位文件的定位文件的定位文件的定位文件的打開與關閉文件的讀寫操作文件的定位標題基于數(shù)據(jù)流的IO操作本講大綱:文件的打文件的打文件的打文件的打開與關開與關開與關開與關閉閉字符字符字符字符輸輸入入入入輸輸出出出出字符串字符串字符串字符串輸輸入入入入輸輸出出出出數(shù)數(shù)數(shù)數(shù)據(jù)據(jù)據(jù)據(jù)塊輸塊輸入入入入輸輸出出出出格式化格式化格式化格式化輸輸入入入入輸輸出出出出操作操作操作操作讀讀寫寫寫寫位置的函位置的函位置的函位置的函數(shù)數(shù)數(shù)數(shù)C C C C標標準準準準庫庫的的的的I/OI/OI/OI/O緩緩沖沖沖沖區(qū)區(qū)區(qū)區(qū)文件的打開與關閉字符輸入輸出字符串輸入輸出數(shù)據(jù)塊輸入輸出格式化輸入輸出操作讀寫位置的函數(shù)C標準庫的I/O緩沖區(qū)標題信號概述本講大綱:在在在在終終端中端中端中端中查查看常看??闯?闯R娨姷男诺男诺男诺男盘柼柼柼栃判判判盘柼柼柼柼幪幚砝砝砝碓诮K端中查看常見的信號 在在在在LinuxLinuxLinuxLinux這個多用戶多進程的系統(tǒng)中,信號的存在是必然的,信這個多用戶多進程的系統(tǒng)中,信號的存在是必然的,信這個多用戶多進程的系統(tǒng)中,信號的存在是必然的,信這個多用戶多進程的系統(tǒng)中,信號的存在是必然的,信號可以理解為一個軟中斷,在某個條件下,系統(tǒng)會發(fā)出某個信號給號可以理解為一個軟中斷,在某個條件下,系統(tǒng)會發(fā)出某個信號給號可以理解為一個軟中斷,在某個條件下,系統(tǒng)會發(fā)出某個信號給號可以理解為一個軟中斷,在某個條件下,系統(tǒng)會發(fā)出某個信號給正在運行的進程,通知進程需要去執(zhí)行某一特定的事件。正在運行的進程,通知進程需要去執(zhí)行某一特定的事件。正在運行的進程,通知進程需要去執(zhí)行某一特定的事件。正在運行的進程,通知進程需要去執(zhí)行某一特定的事件。在前面的進程控制一章中,介紹了在終端中可以使用在前面的進程控制一章中,介紹了在終端中可以使用在前面的進程控制一章中,介紹了在終端中可以使用在前面的進程控制一章中,介紹了在終端中可以使用killkillkillkill命令查看命令查看命令查看命令查看LinuxLinuxLinuxLinux系統(tǒng)中所支持的信號,這些信號都是以系統(tǒng)中所支持的信號,這些信號都是以系統(tǒng)中所支持的信號,這些信號都是以系統(tǒng)中所支持的信號,這些信號都是以SIGSIGSIGSIG開頭的,接下來開頭的,接下來開頭的,接下來開頭的,接下來對對對對LinuxLinuxLinuxLinux系統(tǒng)中常見的信號進行介紹。系統(tǒng)中常見的信號進行介紹。系統(tǒng)中常見的信號進行介紹。系統(tǒng)中常見的信號進行介紹。11.1.1 11.1.1 在在終終端中端中查查看??闯R娨姷男诺男盘柼?在終端中輸入命令在終端中輸入命令在終端中輸入命令在終端中輸入命令“kill l”kill l”kill l”kill l”可以列出可以列出可以列出可以列出LinuxLinuxLinuxLinux系統(tǒng)中的所有信號,系統(tǒng)中的所有信號,系統(tǒng)中的所有信號,系統(tǒng)中的所有信號,如圖如圖如圖如圖11.111.111.111.1所示。所示。所示。所示。說明:圖說明:圖說明:圖說明:圖11.111.111.111.1中,每一個信號類型前面都有一個正整數(shù),中,每一個信號類型前面都有一個正整數(shù),中,每一個信號類型前面都有一個正整數(shù),中,每一個信號類型前面都有一個正整數(shù),這個正整數(shù)與信號代表相同的含義,稱之為信號編號。這個正整數(shù)與信號代表相同的含義,稱之為信號編號。這個正整數(shù)與信號代表相同的含義,稱之為信號編號。這個正整數(shù)與信號代表相同的含義,稱之為信號編號。信號的宏定義和編號都定義在信號的宏定義和編號都定義在信號的宏定義和編號都定義在信號的宏定義和編號都定義在signal.hsignal.hsignal.hsignal.h頭文件中。在終端中可頭文件中。在終端中可頭文件中。在終端中可頭文件中。在終端中可以通過輸入命令以通過輸入命令以通過輸入命令以通過輸入命令“man 7 signal”man 7 signal”man 7 signal”man 7 signal”查看查看查看查看LinuxLinuxLinuxLinux系統(tǒng)中支持的信號的詳系統(tǒng)中支持的信號的詳系統(tǒng)中支持的信號的詳系統(tǒng)中支持的信號的詳細含義,如圖細含義,如圖細含義,如圖細含義,如圖11.211.211.211.2所示。所示。所示。所示。信號處理 信號作為一種進程間通信的機制,主要用于處理異步事件,通信號作為一種進程間通信的機制,主要用于處理異步事件,通信號作為一種進程間通信的機制,主要用于處理異步事件,通信號作為一種進程間通信的機制,主要用于處理異步事件,通常如果有信號發(fā)送到正在執(zhí)行的進程中時,進程會有如下常如果有信號發(fā)送到正在執(zhí)行的進程中時,進程會有如下常如果有信號發(fā)送到正在執(zhí)行的進程中時,進程會有如下常如果有信號發(fā)送到正在執(zhí)行的進程中時,進程會有如下3 3 3 3種處理種處理種處理種處理信號的方法:信號的方法:信號的方法:信號的方法:(1 1 1 1)默認信號的處理方法,系統(tǒng)為每一個信號都設置了默認的處)默認信號的處理方法,系統(tǒng)為每一個信號都設置了默認的處)默認信號的處理方法,系統(tǒng)為每一個信號都設置了默認的處)默認信號的處理方法,系統(tǒng)為每一個信號都設置了默認的處理方法,通常為終止進程。理方法,通常為終止進程。理方法,通常為終止進程。理方法,通常為終止進程。(2 2 2 2)捕捉信號,使進程執(zhí)行指定的程序代碼。)捕捉信號,使進程執(zhí)行指定的程序代碼。)捕捉信號,使進程執(zhí)行指定的程序代碼。)捕捉信號,使進程執(zhí)行指定的程序代碼。(3 3 3 3)忽略信號,對該信號不做任何處理。進程繼續(xù)執(zhí)行。)忽略信號,對該信號不做任何處理。進程繼續(xù)執(zhí)行。)忽略信號,對該信號不做任何處理。進程繼續(xù)執(zhí)行。)忽略信號,對該信號不做任何處理。進程繼續(xù)執(zhí)行。這這這這3 3 3 3種處理捕捉到的信號的方法只是比較基本的方法,在實際應用種處理捕捉到的信號的方法只是比較基本的方法,在實際應用種處理捕捉到的信號的方法只是比較基本的方法,在實際應用種處理捕捉到的信號的方法只是比較基本的方法,在實際應用中,對信號的處理并不會這么單一,例如,有些進程在執(zhí)行時不希中,對信號的處理并不會這么單一,例如,有些進程在執(zhí)行時不希中,對信號的處理并不會這么單一,例如,有些進程在執(zhí)行時不希中,對信號的處理并不會這么單一,例如,有些進程在執(zhí)行時不希望被信號突然打斷,但是還不希望忽略此信號,此時進程會將該信望被信號突然打斷,但是還不希望忽略此信號,此時進程會將該信望被信號突然打斷,但是還不希望忽略此信號,此時進程會將該信望被信號突然打斷,但是還不希望忽略此信號,此時進程會將該信號掛起,在需要時在處理該信號。號掛起,在需要時在處理該信號。號掛起,在需要時在處理該信號。號掛起,在需要時在處理該信號。產(chǎn)生信號本講大綱:kill()kill()kill()kill()函函函函數(shù)數(shù)數(shù)數(shù)raise()raise()raise()raise()函函函函數(shù)數(shù)數(shù)數(shù)alarm()alarm()alarm()alarm()函函函函數(shù)數(shù)數(shù)數(shù)kill()函數(shù)前面介紹的在終端中通過前面介紹的在終端中通過前面介紹的在終端中通過前面介紹的在終端中通過killkillkillkill命令產(chǎn)生信號的方法,原理主要是命令產(chǎn)生信號的方法,原理主要是命令產(chǎn)生信號的方法,原理主要是命令產(chǎn)生信號的方法,原理主要是killkillkillkill命令調用了命令調用了命令調用了命令調用了killkillkillkill()()()()函數(shù)實現(xiàn)了這個功能。函數(shù)實現(xiàn)了這個功能。函數(shù)實現(xiàn)了這個功能。函數(shù)實現(xiàn)了這個功能。kill()kill()kill()kill()函數(shù)主要用于向指定的進程或進程組發(fā)送信號,該函數(shù)的定義形式為:函數(shù)主要用于向指定的進程或進程組發(fā)送信號,該函數(shù)的定義形式為:函數(shù)主要用于向指定的進程或進程組發(fā)送信號,該函數(shù)的定義形式為:函數(shù)主要用于向指定的進程或進程組發(fā)送信號,該函數(shù)的定義形式為:#include#include#include#include#include#include#include#includeInt kill(pid_t pid,int sig);Int kill(pid_t pid,int sig);Int kill(pid_t pid,int sig);Int kill(pid_t pid,int sig);參數(shù)參數(shù)參數(shù)參數(shù)pidpidpidpid為進程號或進程組號;參數(shù)為進程號或進程組號;參數(shù)為進程號或進程組號;參數(shù)為進程號或進程組號;參數(shù)sigsigsigsig為要發(fā)送的信號類型的編號。為要發(fā)送的信號類型的編號。為要發(fā)送的信號類型的編號。為要發(fā)送的信號類型的編號。參數(shù)參數(shù)參數(shù)參數(shù)pidpidpidpid的取值范圍不同,發(fā)送的信號觸發(fā)的事件也是不同的,其取值范圍如下:的取值范圍不同,發(fā)送的信號觸發(fā)的事件也是不同的,其取值范圍如下:的取值范圍不同,發(fā)送的信號觸發(fā)的事件也是不同的,其取值范圍如下:的取值范圍不同,發(fā)送的信號觸發(fā)的事件也是不同的,其取值范圍如下:pid=0pid=0pid=0pid=0:將信號發(fā)送到當前進程所在的進程組里的每一個進程。:將信號發(fā)送到當前進程所在的進程組里的每一個進程。:將信號發(fā)送到當前進程所在的進程組里的每一個進程。:將信號發(fā)送到當前進程所在的進程組里的每一個進程。pid=-1pid=-1pid=-1pid=-1:將信號發(fā)送給除了:將信號發(fā)送給除了:將信號發(fā)送給除了:將信號發(fā)送給除了initinitinitinit進程外的當前進程中有權發(fā)送的所有進進程外的當前進程中有權發(fā)送的所有進進程外的當前進程中有權發(fā)送的所有進進程外的當前進程中有權發(fā)送的所有進程。程。程。程。pid-1pid-1pid-1pid-1:將信號發(fā)送給進程組(:將信號發(fā)送給進程組(:將信號發(fā)送給進程組(:將信號發(fā)送給進程組(-pid-pid-pid-pid)中的每一個進程。)中的每一個進程。)中的每一個進程。)中的每一個進程。如果如果如果如果pidpidpidpid為一個有效的進程或進程組號,信號將發(fā)送給為一個有效的進程或進程組號,信號將發(fā)送給為一個有效的進程或進程組號,信號將發(fā)送給為一個有效的進程或進程組號,信號將發(fā)送給pidpidpidpid所代表的進程所代表的進程所代表的進程所代表的進程或進程組?;蜻M程組?;蜻M程組?;蜻M程組。&說明:如果參數(shù)說明:如果參數(shù)說明:如果參數(shù)說明:如果參數(shù)sigsigsigsig為為為為0 0 0 0,就沒有信號可以發(fā)送,但會進行錯誤檢查。,就沒有信號可以發(fā)送,但會進行錯誤檢查。,就沒有信號可以發(fā)送,但會進行錯誤檢查。,就沒有信號可以發(fā)送,但會進行錯誤檢查。raise()函數(shù)raise()raise()raise()raise()函函函函數(shù)數(shù)數(shù)數(shù)主要用于主要用于主要用于主要用于將將將將信信信信號號號號發(fā)發(fā)送送送送給給當當當當前前前前進進程。程。程。程。raise()raise()raise()raise()函函函函數(shù)數(shù)數(shù)數(shù)的原型的原型的原型的原型為為:#include#include#include#includeInt raise(int sig);Int raise(int sig);Int raise(int sig);Int raise(int sig);參數(shù)參數(shù)參數(shù)參數(shù)sigsigsigsig為發(fā)送的信號類型的編號。為發(fā)送的信號類型的編號。為發(fā)送的信號類型的編號。為發(fā)送的信號類型的編號。如果函數(shù)調用成功,返回值為如果函數(shù)調用成功,返回值為如果函數(shù)調用成功,返回值為如果函數(shù)調用成功,返回值為0 0 0 0;如果調用失敗,返回值為非;如果調用失敗,返回值為非;如果調用失敗,返回值為非;如果調用失敗,返回值為非0 0 0 0。說明:由說明:由說明:由說明:由raise()raise()raise()raise()函數(shù)的功能可以知道,使用函數(shù)的功能可以知道,使用函數(shù)的功能可以知道,使用函數(shù)的功能可以知道,使用kill()kill()kill()kill()函數(shù)也函數(shù)也函數(shù)也函數(shù)也可以實現(xiàn)這一功能,如可以實現(xiàn)這一功能,如可以實現(xiàn)這一功能,如可以實現(xiàn)這一功能,如kill(getpid(),sig)kill(getpid(),sig)kill(getpid(),sig)kill(getpid(),sig)。alarm()函數(shù)alarm()alarm()alarm()alarm()函函函函數(shù)數(shù)數(shù)數(shù)主要用于主要用于主要用于主要用于為發(fā)為發(fā)送的信送的信送的信送的信號號號號設設定一定一定一定一個個個個時間時間警告,使系警告,使系警告,使系警告,使系統(tǒng)統(tǒng)在在在在設設定的定的定的定的時間時間之后之后之后之后發(fā)發(fā)送信送信送信送信號號號號。alarm()alarm()alarm()alarm()函函函函數(shù)數(shù)數(shù)數(shù)的原型的原型的原型的原型為為:#include#include#include#includeunsigned int alarm(unsigned int seconds);unsigned int alarm(unsigned int seconds);unsigned int alarm(unsigned int seconds);unsigned int alarm(unsigned int seconds);參數(shù)參數(shù)參數(shù)參數(shù)secondssecondssecondsseconds為設定的時間值。如果為設定的時間值。如果為設定的時間值。如果為設定的時間值。如果secondssecondssecondsseconds設置為設置為設置為設置為0 0 0 0值,那么值,那么值,那么值,那么alarmalarmalarmalarm()()()()函數(shù)設置的警告時鐘將無效。函數(shù)設置的警告時鐘將無效。函數(shù)設置的警告時鐘將無效。函數(shù)設置的警告時鐘將無效。alarm()alarm()alarm()alarm()函數(shù)安排在函數(shù)安排在函數(shù)安排在函數(shù)安排在secondssecondssecondsseconds時間之后,發(fā)送一個信號時間之后,發(fā)送一個信號時間之后,發(fā)送一個信號時間之后,發(fā)送一個信號SIGALRMSIGALRMSIGALRMSIGALRM給進程。在默認的情況下,進程接收到給進程。在默認的情況下,進程接收到給進程。在默認的情況下,進程接收到給進程。在默認的情況下,進程接收到SIGALRMSIGALRMSIGALRMSIGALRM信號會終止運行。信號會終止運行。信號會終止運行。信號會終止運行。如果不希望終止進程,可以在進程捕獲到該信號后修改默認的處如果不希望終止進程,可以在進程捕獲到該信號后修改默認的處如果不希望終止進程,可以在進程捕獲到該信號后修改默認的處如果不希望終止進程,可以在進程捕獲到該信號后修改默認的處理函數(shù)。理函數(shù)。理函數(shù)。理函數(shù)。調用調用調用調用alarm()alarm()alarm()alarm()函數(shù)后,之前設置的任何警告時鐘都取消。函數(shù)后,之前設置的任何警告時鐘都取消。函數(shù)后,之前設置的任何警告時鐘都取消。函數(shù)后,之前設置的任何警告時鐘都取消。標題捕捉信號本講大綱:signal()signal()signal()signal()函函函函數(shù)數(shù)數(shù)數(shù)sigaction()sigaction()sigaction()sigaction()函函函函數(shù)數(shù)數(shù)數(shù)signal()函數(shù)sigaction()函數(shù)標題信號的阻塞本講大綱:sigprocmask()sigprocmask()sigprocmask()sigprocmask()函函函函數(shù)數(shù)數(shù)數(shù)sigsuspend()sigsuspend()sigsuspend()sigsuspend()函函函函數(shù)數(shù)數(shù)數(shù)sigpending()sigpending()sigpending()sigpending()函函函函數(shù)數(shù)數(shù)數(shù)sigprocmask()函數(shù)在前面介紹信號處理時,提到了信號的處理并沒有那么的簡單,而是有的時候進程并不希望被突如在前面介紹信號處理時,提到了信號的處理并沒有那么的簡單,而是有的時候進程并不希望被突如在前面介紹信號處理時,提到了信號的處理并沒有那么的簡單,而是有的時候進程并不希望被突如在前面介紹信號處理時,提到了信號的處理并沒有那么的簡單,而是有的時候進程并不希望被突如其來的信號中斷當前的執(zhí)行,也不希望信號從此被忽略掉,而是希望過一段時間之后再去處理這個其來的信號中斷當前的執(zhí)行,也不希望信號從此被忽略掉,而是希望過一段時間之后再去處理這個其來的信號中斷當前的執(zhí)行,也不希望信號從此被忽略掉,而是希望過一段時間之后再去處理這個其來的信號中斷當前的執(zhí)行,也不希望信號從此被忽略掉,而是希望過一段時間之后再去處理這個信號,這種情況下,可以使用阻塞信號的方法來實現(xiàn)。能夠實現(xiàn)信號阻塞的操作有信號,這種情況下,可以使用阻塞信號的方法來實現(xiàn)。能夠實現(xiàn)信號阻塞的操作有信號,這種情況下,可以使用阻塞信號的方法來實現(xiàn)。能夠實現(xiàn)信號阻塞的操作有信號,這種情況下,可以使用阻塞信號的方法來實現(xiàn)。能夠實現(xiàn)信號阻塞的操作有3 3 3 3個系統(tǒng)調用函個系統(tǒng)調用函個系統(tǒng)調用函個系統(tǒng)調用函數(shù),分別是數(shù),分別是數(shù),分別是數(shù),分別是sigprocmask()sigprocmask()sigprocmask()sigprocmask()函數(shù)、函數(shù)、函數(shù)、函數(shù)、sigsuspend()sigsuspend()sigsuspend()sigsuspend()函數(shù)和函數(shù)和函數(shù)和函數(shù)和sigpending()sigpending()sigpending()sigpending()函數(shù),下面分別對它們進行詳函數(shù),下面分別對它們進行詳函數(shù),下面分別對它們進行詳函數(shù),下面分別對它們進行詳細講解。細講解。細講解。細講解。說明:信號屏蔽字就是進程中被阻塞的信號集,這些信號不能發(fā)送給該進程,它們在該說明:信號屏蔽字就是進程中被阻塞的信號集,這些信號不能發(fā)送給該進程,它們在該說明:信號屏蔽字就是進程中被阻塞的信號集,這些信號不能發(fā)送給該進程,它們在該說明:信號屏蔽字就是進程中被阻塞的信號集,這些信號不能發(fā)送給該進程,它們在該進程中被進程中被進程中被進程中被 屏蔽屏蔽屏蔽屏蔽 了,也就是被阻塞了。了,也就是被阻塞了。了,也就是被阻塞了。了,也就是被阻塞了。11.4.1 sigprocmask()11.4.1 sigprocmask()函數(shù)函數(shù)sigprocmask()sigprocmask()sigprocmask()sigprocmask()函函函函數(shù)數(shù)數(shù)數(shù)可用于可用于可用于可用于檢測檢測和改和改和改和改變進變進程的信程的信程的信程的信號號號號掩掩掩掩碼碼,該該函函函函數(shù)數(shù)數(shù)數(shù)的定的定的定的定義義形式如下:形式如下:形式如下:形式如下:#include#include#include#includeInt sigprocmask(int how,const sigset_t*newset,sigset_t*oldset);Int sigprocmask(int how,const sigset_t*newset,sigset_t*oldset);Int sigprocmask(int how,const sigset_t*newset,sigset_t*oldset);Int sigprocmask(int how,const sigset_t*newset,sigset_t*oldset);sigprocmask()sigprocmask()sigprocmask()sigprocmask()函函函函數(shù)數(shù)數(shù)數(shù)有有有有3 3 3 3個參數(shù)個參數(shù)個參數(shù)個參數(shù),參數(shù)參數(shù)參數(shù)參數(shù)howhowhowhow表示修改信表示修改信表示修改信表示修改信號屏號屏號屏號屏蔽字的方式;蔽字的方式;蔽字的方式;蔽字的方式;參數(shù)參數(shù)參數(shù)參數(shù)newsetnewsetnewsetnewset表示把表示把表示把表示把這這個個個個信信信信號號號號集集集集設為設為新的新的新的新的當當當當前信前信前信前信號屏號屏號屏號屏蔽字,如果蔽字,如果蔽字,如果蔽字,如果為為NULLNULLNULLNULL則則不改不改不改不改變變;參數(shù)參數(shù)參數(shù)參數(shù)oldsetoldsetoldsetoldset表示保存表示保存表示保存表示保存進進程程程程舊舊舊舊的信的信的信的信號屏號屏號屏號屏蔽字,蔽字,蔽字,蔽字,如果如果如果如果為為NULLNULLNULLNULL則則不保存。不保存。不保存。不保存。參數(shù)參數(shù)參數(shù)參數(shù)howhowhowhow的取的取的取的取值值不同不同不同不同帶帶來來來來的操作行的操作行的操作行的操作行為為也不同,也不同,也不同,也不同,該該參數(shù)參數(shù)參數(shù)參數(shù)的可的可的可的可選值選值如下:如下:如下:如下:SIG_BLOCKSIG_BLOCKSIG_BLOCKSIG_BLOCK:該值該值代表的功能是代表的功能是代表的功能是代表的功能是將將將將newsetnewsetnewsetnewset所指向的信所指向的信所指向的信所指向的信號號號號集中所包含的信集中所包含的信集中所包含的信集中所包含的信號號號號加到加到加到加到當當當當前的信前的信前的信前的信號號號號掩掩掩掩碼碼中中中中作作作作為為新的信新的信新的信新的信號屏號屏號屏號屏蔽字。蔽字。蔽字。蔽字。SIG_UNBLOCKSIG_UNBLOCKSIG_UNBLOCKSIG_UNBLOCK:將參數(shù)將參數(shù)將參數(shù)將參數(shù)newsetnewsetnewsetnewset所指向的信所指向的信所指向的信所指向的信號號號號集中的信集中的信集中的信集中的信號從當號從當號從當號從當前的信前的信前的信前的信號號號號掩掩掩掩碼碼中移除。中移除。中移除。中移除。SIG_SETMASKSIG_SETMASKSIG_SETMASKSIG_SETMASK:設設置置置置當當當當前信前信前信前信號號號號掩掩掩掩碼為碼為參數(shù)參數(shù)參數(shù)參數(shù)newsetnewsetnewsetnewset所指向的信所指向的信所指向的信所指向的信號號號號集中所包含的信集中所包含的信集中所包含的信集中所包含的信號號號號。函數(shù)調用成功則返回函數(shù)調用成功則返回函數(shù)調用成功則返回函數(shù)調用成功則返回0 0 0 0;出錯則返回;出錯則返回;出錯則返回;出錯則返回-1-1-1-1。注意:注意:注意:注意:sigprocmask()sigprocmask()sigprocmask()sigprocmask()函數(shù)只為單線程定義的,在多線程中要使用函數(shù)只為單線程定義的,在多線程中要使用函數(shù)只為單線程定義的,在多線程中要使用函數(shù)只為單線程定義的,在多線程中要使用pthread_sigmaskpthread_sigmaskpthread_sigmaskpthread_sigmask變量,在使變量,在使變量,在使變量,在使用之前需要聲明和初始化。用之前需要聲明和初始化。用之前需要聲明和初始化。用之前需要聲明和初始化。sigsuspend()函數(shù)sigsuspend()sigsuspend()sigsuspend()sigsuspend()函函函函數(shù)數(shù)數(shù)數(shù)主要主要主要主要實現(xiàn)實現(xiàn)了等待一了等待一了等待一了等待一個個個個信信信信號號號號的到的到的到的到來來來來,即,即,即,即將當將當將當將當前前前前進進程掛起。程掛起。程掛起。程掛起。該該函函函函數(shù)數(shù)數(shù)數(shù)的定的定的定的定義義形式如下:形式如下:形式如下:形式如下:#include#include#include#includeInt sigsuspend(const sigset_t*mask);Int sigsuspend(const sigset_t*mask);Int sigsuspend(const sigset_t*mask);Int sigsuspend(const sigset_t*mask);參數(shù)參數(shù)參數(shù)參數(shù)maskmaskmaskmask是一個是一個是一個是一個sigset_tsigset_tsigset_tsigset_t結構體類型的指針,指向一個信號集,結構體類型的指針,指向一個信號集,結構體類型的指針,指向一個信號集,結構體類型的指針,指向一個信號集,當函數(shù)當函數(shù)當函數(shù)當函數(shù)sigsuspend()sigsuspend()sigsuspend()sigsuspend()函數(shù)被調用時,參數(shù)函數(shù)被調用時,參數(shù)函數(shù)被調用時,參數(shù)函數(shù)被調用時,參數(shù)maskmaskmaskmask所指向的信號集中所指向的信號集中所指向的信號集中所指向的信號集中的信號被復制給信號掩碼。隨后,進程會被掛起,直到信號被捕捉的信號被復制給信號掩碼。隨后,進程會被掛起,直到信號被捕捉的信號被復制給信號掩碼。隨后,進程會被掛起,直到信號被捕捉的信號被復制給信號掩碼。隨后,進程會被掛起,直到信號被捕捉到,執(zhí)行信號相應的處理方法返回時,該函數(shù)才會返回,此時,信到,執(zhí)行信號相應的處理方法返回時,該函數(shù)才會返回,此時,信到,執(zhí)行信號相應的處理方法返回時,該函數(shù)才會返回,此時,信到,執(zhí)行信號相應的處理方法返回時,該函數(shù)才會返回,此時,信號掩碼恢復為函數(shù)調用前的值。號掩碼恢復為函數(shù)調用前的值。號掩碼恢復為函數(shù)調用前的值。號掩碼恢復為函數(shù)調用前的值。sigpending()函數(shù)標題信號處理的安全問題 在多進程通信時,開發(fā)人員通常都會考慮到每個進程運行的安全問題,信號作為進程的異步通信方式,在多進程通信時,開發(fā)人員通常都會考慮到每個進程運行的安全問題,信號作為進程的異步通信方式,在多進程通信時,開發(fā)人員通常都會考慮到每個進程運行的安全問題,信號作為進程的異步通信方式,在多進程通信時,開發(fā)人員通常都會考慮到每個進程運行的安全問題,信號作為進程的異步通信方式,在實際應用中是相當方便的,但是信號的使用存在一定的安全隱患。信號并不僅是在程序出現(xiàn)錯誤時才調用在實際應用中是相當方便的,但是信號的使用存在一定的安全隱患。信號并不僅是在程序出現(xiàn)錯誤時才調用在實際應用中是相當方便的,但是信號的使用存在一定的安全隱患。信號并不僅是在程序出現(xiàn)錯誤時才調用在實際應用中是相當方便的,但是信號的使用存在一定的安全隱患。信號并不僅是在程序出現(xiàn)錯誤時才調用的。有的時候開發(fā)人員也會為了實現(xiàn)某些邏輯的需求,而在程序中安裝一個信號,例如,的。有的時候開發(fā)人員也會為了實現(xiàn)某些邏輯的需求,而在程序中安裝一個信號,例如,的。有的時候開發(fā)人員也會為了實現(xiàn)某些邏輯的需求,而在程序中安裝一個信號,例如,的。有的時候開發(fā)人員也會為了實現(xiàn)某些邏輯的需求,而在程序中安裝一個信號,例如,SIGUSR1SIGUSR1SIGUSR1SIGUSR1(預留信(預留信(預留信(預留信號)、號)、號)、號)、SIGRTMINSIGRTMINSIGRTMINSIGRTMIN(未定義)等,信號在執(zhí)行了相應的處理函數(shù)后,剩下的程序還將正常運行,此時,開發(fā)(未定義)等,信號在執(zhí)行了相應的處理函數(shù)后,剩下的程序還將正常運行,此時,開發(fā)(未定義)等,信號在執(zhí)行了相應的處理函數(shù)后,剩下的程序還將正常運行,此時,開發(fā)(未定義)等,信號在執(zhí)行了相應的處理函數(shù)后,剩下的程序還將正常運行,此時,開發(fā)人員容易被產(chǎn)生的信號進入另一個運行順序中,而忽略了該信號處理函數(shù)執(zhí)行時的上下文。人員容易被產(chǎn)生的信號進入另一個運行順序中,而忽略了該信號處理函數(shù)執(zhí)行時的上下文。人員容易被產(chǎn)生的信號進入另一個運行順序中,而忽略了該信號處理函數(shù)執(zhí)行時的上下文。人員容易被產(chǎn)生的信號進入另一個運行順序中,而忽略了該信號處理函數(shù)執(zhí)行時的上下文。由于信號是用來處理異步事件的,也就是說,信號處理函數(shù)執(zhí)行的上下文所實現(xiàn)的功能是不確定的,例由于信號是用來處理異步事件的,也就是說,信號處理函數(shù)執(zhí)行的上下文所實現(xiàn)的功能是不確定的,例由于信號是用來處理異步事件的,也就是說,信號處理函數(shù)執(zhí)行的上下文所實現(xiàn)的功能是不確定的,例由于信號是用來處理異步事件的,也就是說,信號處理函數(shù)執(zhí)行的上下文所實現(xiàn)的功能是不確定的,例如,一個運行中的程序在調用某個庫函數(shù)時,可能會被突如其來的信號中斷,庫函數(shù)會提前出錯返回,進而如,一個運行中的程序在調用某個庫函數(shù)時,可能會被突如其來的信號中斷,庫函數(shù)會提前出錯返回,進而如,一個運行中的程序在調用某個庫函數(shù)時,可能會被突如其來的信號中斷,庫函數(shù)會提前出錯返回,進而如,一個運行中的程序在調用某個庫函數(shù)時,可能會被突如其來的信號中斷,庫函數(shù)會提前出錯返回,進而轉去執(zhí)行該信號的處理函數(shù)。對于轉去執(zhí)行該信號的處理函數(shù)。對于轉去執(zhí)行該信號的處理函數(shù)。對于轉去執(zhí)行該信號的處理函數(shù)。對于alarm()alarm()alarm()alarm()函數(shù)產(chǎn)生信號時,在信號處理后,應用程序并不會終止,還是會繼函數(shù)產(chǎn)生信號時,在信號處理后,應用程序并不會終止,還是會繼函數(shù)產(chǎn)生信號時,在信號處理后,應用程序并不會終止,還是會繼函數(shù)產(chǎn)生信號時,在信號處理后,應用程序并不會終止,還是會繼續(xù)正常運行,因此在編寫此類信號處理函數(shù)時,需要特別的小心,防止破壞應用程序的正常運行。續(xù)正常運行,因此在編寫此類信號處理函數(shù)時,需要特別的小心,防止破壞應用程序的正常運行。續(xù)正常運行,因此在編寫此類信號處理函數(shù)時,需要特別的小心,防止破壞應用程序的正常運行。續(xù)正常運行,因此在編寫此類信號處理函數(shù)時,需要特別的小心,防止破壞應用程序的正常運行。因此,在程序中使用信號做相應的事件處理時,往往需要遵循一些規(guī)則,才能有效的為信號的使用帶來方便、因此,在程序中使用信號做相應的事件處理時,往往需要遵循一些規(guī)則,才能有效的為信號的使用帶來方便、因此,在程序中使用信號做相應的事件處理時,往往需要遵循一些規(guī)則,才能有效的為信號的使用帶來方便、因此,在程序中使用信號做相應的事件處理時,往往需要遵循一些規(guī)則,才能有效的為信號的使用帶來方便、安全。規(guī)則如下:安全。規(guī)則如下:安全。規(guī)則如下:安全。規(guī)則如下:(1 1 1 1)信號處理函數(shù)最好執(zhí)行簡單的操作,復雜的操作盡量留在信號處理函數(shù)之外實現(xiàn)。)信號處理函數(shù)最好執(zhí)行簡單的操作,復雜的操作盡量留在信號處理函數(shù)之外實現(xiàn)。)信號處理函數(shù)最好執(zhí)行簡單的操作,復雜的操作盡量留在信號處理函數(shù)之外實現(xiàn)。)信號處理函數(shù)最好執(zhí)行簡單的操作,復雜的操作盡量留在信號處理函數(shù)之外實現(xiàn)。(2 2 2 2)errnoerrnoerrnoerrno是程序安全的標識,當程序安全的運行結束時,因為什么而導致程序結束,會通過是程序安全的標識,當程序安全的運行結束時,因為什么而導致程序結束,會通過是程序安全的標識,當程序安全的運行結束時,因為什么而導致程序結束,會通過是程序安全的標識,當程序安全的運行結束時,因為什么而導致程序結束,會通過errnoerrnoerrnoerrno的值而的值而的值而的值而確定,但這個確定,但這個確定,但這個確定,但這個errnoerrnoerrnoerrno所帶來的只是程序的安全,并不是異步信號安全的安全反饋信息。如果信號處理函數(shù)比所帶來的只是程序的安全,并不是異步信號安全的安全反饋信息。如果信號處理函數(shù)比所帶來的只是程序的安全,并不是異步信號安全的安全反饋信息。如果信號處理函數(shù)比所帶來的只是程序的安全,并不是異步信號安全的安全反饋信息。如果信號處理函數(shù)比較復雜,且調用了可能會改變較復雜,且調用了可能會改變較復雜,且調用了可能會改變較復雜,且調用了可能會改變errnoerrnoerrnoerrno值的庫函數(shù),必須考慮在信號處理函數(shù)開始時保存值的庫函數(shù),必須考慮在信號處理函數(shù)開始時保存值的庫函數(shù),必須考慮在信號處理函數(shù)開始時保存值的庫函數(shù),必須考慮在信號處理函數(shù)開始時保存errnoerrnoerrnoerrno值、結束的時候值、結束的時候值、結束的時候值、結束的時候恢復被中斷程序的恢復被中斷程序的恢復被中斷程序的恢復被中斷程序的errnoerrnoerrnoerrno值。值。值。值。(3 3 3 3)在信號處理函數(shù)中只能調用可以重入的)在信號處理函數(shù)中只能調用可以重入的)在信號處理函數(shù)中只能調用可以重入的)在信號處理函數(shù)中只能調用可以重入的C C C C庫函數(shù),不能調用庫函數(shù),不能調用庫函數(shù),不能調用庫函數(shù),不能調用malloc()malloc()malloc()malloc()、free()free()free()free()以及標準以及標準以及標準以及標準I/OI/OI/OI/O庫等函數(shù)。庫等函數(shù)。庫等函數(shù)。庫等函數(shù)。(4 4 4 4)如果在信號處理函數(shù)中訪問了全局變量,那么,在定義此全局變量時,需要將其聲明為)如果在信號處理函數(shù)中訪問了全局變量,那么,在定義此全局變量時,需要將其聲明為)如果在信號處理函數(shù)中訪問了全局變量,那么,在定義此全局變量時,需要將其聲明為)如果在信號處理函數(shù)中訪問了全局變量,那么,在定義此全局變量時,需要將其聲明為volatilevolatilevolatilevolatile,以避,以避,以避,以避免編譯器不恰當?shù)膬?yōu)化。免編譯器不恰當?shù)膬?yōu)化。免編譯器不恰當?shù)膬?yōu)化。免編譯器不恰當?shù)膬?yōu)化。標題
收藏
編號:48760993
類型:共享資源
大小:33.07MB
格式:ZIP
上傳時間:2022-01-14
30
積分
- 關 鍵 詞:
-
Linux基礎
Linux
基礎
電子
課件
- 資源描述:
-
《Linux基礎》電子課件,Linux基礎,Linux,基礎,電子,課件
展開閱讀全文
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。