在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > linux基礎(chǔ)復(fù)習(xí)(6)文件I/O操作

            linux基礎(chǔ)復(fù)習(xí)(6)文件I/O操作

            作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

            上鎖,也就是記錄鎖。記錄鎖又可分為讀取鎖和寫入鎖,其中讀取鎖又稱為共享鎖,它能夠使多個(gè)進(jìn)程都能在

            文件的同一部分建立讀取鎖。而寫入鎖又稱為排斥鎖,在任何時(shí)刻只能有一個(gè)進(jìn)程在文件的某個(gè)部分上建立寫入鎖。當(dāng)然,在文件的同一部分不能同時(shí)建立讀取鎖和寫入鎖。

            fcntl函數(shù)格式

            fcntl函數(shù)可以改變已經(jīng)打開文件的性質(zhì)。

            #i nclude

            #i nclude

            #i nclude

            int fcntl(int filedes, int cmd, ... ) ;

            返回:若成功則依賴于cmd(見下),若出錯(cuò)為- 1。

            f c n t l函數(shù)有五種功能:

            n 復(fù)制一個(gè)現(xiàn)存的描述符, 新文件描述符作為函數(shù)值返(c m d=F_DUPFD)。

            n 獲得/設(shè)置文件描述符標(biāo)記,對(duì)應(yīng)于filedes 的文件描述符標(biāo)志作為函數(shù)值返回.(c m d = F_GETFD或F_SETFD)。

            n 獲得/設(shè)置文件狀態(tài)標(biāo)志,對(duì)應(yīng)于filedes 的文件狀態(tài)標(biāo)志作為函數(shù)值返回。(c m d = F_GETFL或F_SETFL)。

            n 獲得/設(shè)置異步I / O有權(quán)(c m d = F_GETOWN或F_SETOWN)。

            n 獲得/設(shè)置記錄鎖(c m d = F_SETLK , F_SETLKW)。

            關(guān)于加鎖和解鎖區(qū)域的說(shuō)明還要注意下列各點(diǎn):

            l 該區(qū)域可以在當(dāng)前文件尾端處開始或越過其尾端處開始,但是不能在文件起始位置之前開始或越過該起始位置。

            l 如若l_len為0,則表示鎖的區(qū)域從其起點(diǎn)(由l_start和l_whence決定)開始直至最大可能位置為止。也就是不管添寫到該文件中多少數(shù)據(jù),它都處于鎖的范圍。

            l 為了鎖整個(gè)文件,通常的方法是將l_start說(shuō)明為0,l_whence說(shuō)明為SEEK_SET,l_len說(shuō)明為0。

            實(shí)例:

            /*fcntl_write.c測(cè)試文件寫入鎖主函數(shù)部分*/

            #i nclude unistd.h>

            #i nclude sys/file.h>

            #i nclude sys/types.h>

            #i nclude sys/stat.h>

            #i nclude stdio.h>

            #i nclude stdlib.h>

            /*lock_set函數(shù)*/

            void lock_set(int fd, int type)

            {

            struct flock lock;

            lock.l_whence = SEEK_SET;//賦值lock結(jié)構(gòu)體

            lock.l_start = 0;

            lock.l_len =0;

            while(1)

            {

            lock.l_type = type;

            /*根據(jù)不同的type值給文件上鎖或解鎖*/

            if((fcntl(fd, F_SETLK, lock)) == 0)

            {

            if( lock.l_type == F_RDLCK )

            printf(read lock set by %dn,getpid());

            else if( lock.l_type == F_WRLCK )

            printf(write lock set by %dn,getpid());

            else if( lock.l_type == F_UNLCK )

            printf(release lock by %dn,getpid());

            return;

            }

            /*判斷文件是否可以上鎖*/

            fcntl(fd, F_GETLK,lock);

            /*判斷文件不能上鎖的原因*/

            if(lock.l_type != F_UNLCK)

            {

            /*/該文件已有寫入鎖*/

            if( lock.l_type == F_RDLCK )

            printf(read lock already set by %dn,lock.l_pid);

            /*該文件已有讀取鎖*/

            else if( lock.l_type == F_WRLCK )

            printf(write lock already set by %dn,lock.l_pid);

            getchar();

            }

            }

            }

            int main(void)

            {

            int fd;

            /*首先打開文件*/

            fd=open(hello,O_RDWR | O_CREAT, 0666);

            if(fd 0)

            {

            perror(open);

            exit(1);

            }

            /*給文件上寫入鎖*/

            lock_set(fd, F_WRLCK);

            getchar();

            /*給文件接鎖*/

            lock_set(fd, F_UNLCK);

            getchar();

            close(fd);

            exit(0);

            }

            開兩個(gè)終端分別運(yùn)行,可看到先運(yùn)行的那個(gè)終端,成功上鎖,后運(yùn)行的那個(gè)無(wú)效??梢妼懭腈i是互斥鎖,一個(gè)時(shí)候只能有一個(gè)寫入鎖存在

            select 實(shí)現(xiàn)I/O復(fù)用

            I/O處理的五種模型

            ① 阻塞I/O模型:若所調(diào)用的I/O函數(shù)沒有完成相關(guān)的功能就會(huì)使進(jìn)程掛起,直到相關(guān)數(shù)據(jù)到達(dá)才會(huì)返回。如:終端、網(wǎng)絡(luò)設(shè)備的訪問。

            ② 非阻塞模型:當(dāng)請(qǐng)求的I/O操作不能完成時(shí),則不讓進(jìn)程休眠,而且返回一個(gè)錯(cuò)誤。如:open、read、write訪問。

            ③ I/O多路轉(zhuǎn)接模型:如果請(qǐng)求的I/O 操作阻塞,且他不是真正阻塞I/O,而且讓其中的一個(gè)函數(shù)等待,在這期間, I/O還能進(jìn)行其他操作。如:select函數(shù)。

            ④ 信號(hào)驅(qū)動(dòng)I/O模型:在這種模型下,通過安裝一個(gè)信號(hào)處理程序,系統(tǒng)可以自動(dòng)捕獲特定信號(hào)的到來(lái),從而啟動(dòng)I/O。

            ⑤ 異步I/O模型:在這種模型下,當(dāng)一個(gè)描述符已準(zhǔn)備好,可以啟動(dòng)I/O時(shí),進(jìn)程會(huì)通知內(nèi)核。由內(nèi)核進(jìn)行后續(xù)處理,這種用法現(xiàn)在較少。

            select函數(shù)

            傳向select的參數(shù)告訴內(nèi)核:

            (1) 我們所關(guān)心的描述符。

            (2) 對(duì)于每個(gè)描述符我們所關(guān)心的條件(是否讀一個(gè)給定的描述符?是否想寫一個(gè)給定的描述符?是否關(guān)心一個(gè)描述符的異常條件?)。

            (3) 希望等待多長(zhǎng)時(shí)間(可以永遠(yuǎn)等待,等待一個(gè)固定量時(shí)間,或完全不等待)。

            從s e l e c t返回時(shí),內(nèi)核告訴我們:

            (1) 已準(zhǔn)備好的描述符的數(shù)量。

            (2) 哪一個(gè)描述符已準(zhǔn)備好讀、寫或異常條件。

            #i nclude /* fd_set data type */

            #i nclude /* struct timeval */

            #i nclude /* function prototype might be here */

            int select (int numfds, fd_set *readfds,

            fd_set *writefds, fd_set *exceptfds, struct timeval * timeout) ;

            返回:準(zhǔn)備就緒的描述符數(shù),若超時(shí)則為0,若出錯(cuò)則為- 1。

            timeout值:

            n NULL:永遠(yuǎn)等待,直到捕捉到信號(hào)或文件描述符已準(zhǔn)備好為止;

            n 具體值: struct timeval 類型的指針,若等待為timeout時(shí)間還沒有文件描述符準(zhǔn)備好,就立即返回;

            n 0:從不等待,測(cè)試所有指定 的描述符并立即返回;

            先說(shuō)明最后一個(gè)參數(shù),它指定愿意等待的時(shí)間。



            關(guān)鍵詞:

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉