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

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

文件I/O之fcntl函數

2024-06-28 13:28:51
字體:
來源:轉載
供稿:網友
文件I/O之fcntl函數

fcntl函數可以改變已打開的文件的性質。

#include <fcntl.h>int fcntl( int filedes, int cmd, ... /* int arg */ );返回值:若成功則依賴于cmd,若出錯則返回-1

在本節的各實例中,第三個參數總是一個整數,與上面所示函數原型中的注釋部分相對應。但是在說明記錄鎖時,第三個參數則是指向一個結構的指針。

fcntl函數有5種功能:

(1)復制一個現有的描述符(cmd = F_DUPFD )。

(2)獲得/設置文件描述符標記(cmd = F_GETFD或F_SETFD)。

(3)獲得/設置文件狀態標志(cmd = F_GETFL或F_SETFL)。

(4)獲得/設置異步I/O所有權(cmd = F_GETOWN或F_SETOWN)。

(5)獲得/設置記錄鎖(cmd = F_GETLK、F_SETLK或F_SETLKW)。

我們先說明這10種cmd值得前7種(后3種,在談記錄鎖時說明)。我們將涉及與進程表項中各文件描述符相關聯的文件描述符標志,以及每個文件表項中的文件狀態標志。

F_DUPFD 復制文件描述符filedes。新文件描述符作為函數值返回。它是尚未打開的各描述符中大于或等于第三個參數值(取為整型值)中各值的最小值。新描述符與filedes共享同一文件表項。但是,新描述符有它自己的一套文件描述符標志,其FD_CLOEXEC文件描述符標志被清除(這表示該描述符在通過一個exec時仍保持有效)。

F_GETFD 對應于filedes的文件描述符標志作為函數值返回。當前只定義了一個文件描述符標志FD_CLOEXEC。

F_SETFD 對于filedes設置文件描述符標志。新標志值按第三個參數(取為整型值)設置。

注:應當了解很多現有的涉及文件描述符標志的程序并不使用常量FD_CLOEXEC,而是將此標志設置為0(系統默認,在exec時不關閉)或1(在exec時關閉)。

F_GETFL 對應于filedes的文件狀態標志作為函數值返回。文件狀態標志如下表3-3:(表3-3中的各個標志,除了三個訪問方式標志(O_RDONLY、O_WRONLY以及O_RDWR)不各占一位,其他標志分別占文件狀態標志的一個bit位)

index

不幸的是,三個訪問方式標志(O_RDONLY、O_WRONLY以及O_RDWR)并不各占1位(由于歷史原因,這三種標志的值分別是0、1和2。這三個訪問方式標志用文件狀態標志的后兩位表示,00:O_RDONLY,01:O_WRONLY,10:O_RDWR。這三種值互斥——一個文件只能有這三種值之一)。因此首先必須用屏蔽字O_ACCMODE(0x0003)取得訪問模式位(文件狀態標志的后兩位),然后將結果與這三種值的任一種做比較。

F_SETFL 將文件狀態標志設置為第三個參數的值(取為整型值)。可以更改的幾個標志是:O_APPEND、O_NONBLOCK、O_SYNC、O_DSYNC、O_RSYNC、O_FSYNC和O_ASYNC。

F_GETOWN 取當前接受SIGIO和SIGURG信號的進程ID或進程組ID。

F_SETOWN 設置接收SIGIO和SIGURG信號的進程ID或進程組ID。正當arg指定一個進程ID,負的arg表示等于arg絕對值的一個進程組ID。

fcntl的返回值與命令有關。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。下列四個命令有特定的返回值:F_DUPFD、F_GETFD、F_GETFL以及F_GETOWN。第一個返回新的文件描述符,接下來兩個返回相應標志,最后一個返回一個正當進程ID或負的進程組ID。

程序清單3-4 對于指定的描述符打印文件標志

[root@localhost apue]# cat PRog3-4.c#include "apue.h"#include <fcntl.h>int main(int argc, char *argv[]){        int val;        if(argc != 2)                err_quit("usage: prog3-4 <descriptor#>");        if((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)                err_sys("fcntl error for fd %d", atoi(argv[1]));        switch(val & O_ACCMODE)        {                case O_RDONLY:                        printf("read only");                        break;                case O_WRONLY:                        printf("write only");                        break;                case O_RDWR:                        printf("read write");                        break;                default:                        err_dump("unknown access mode");        }        if(val & O_APPEND)                printf(", append");        if(val & O_NONBLOCK)                printf(", nonblocking");#if defined(O_SYNC)        if(val & O_SYNC)                printf(", synchronous writes");#endif#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC)        if(val & O_FSYNC)                printf(", synchronous writes");#endif        putchar('/n');        exit(0);}

注意,我們使用了功能測試宏_POSIX_C_SOURCE,并且條件編譯了POSIX.1中沒有定義的文件訪問標志。

在修改文件描述符標志或文件狀態標志時必須謹慎,先要取得現有的標志值,然后根據需要修改它,最后設置新標志值。不能只是執行F_SETFD或F_SETFL命令,這樣會關閉以前設置的標志位。

程序清單3-5 對一個文件描述符打開一個或多個文件狀態標志

[root@localhost apue]# cat prog3-5.c#include "apue.h"#include <fcntl.h>void set_fl(int fd, int flags) /* flags are file status flags to turn to */{        int val;        if((val = fcntl(fd, F_GETFL, 0)) < 0)                err_sys("fcntl F_GETFL error");        val |= flags;   /* turn on flags */        if(fcntl(fd, F_SETFL, val) < 0)                err_sys("fcntl F_SETFL error");}

如果將中間的一條語句改為:

val &= ~flags;    /* turn flags off */

就構成另一個函數,我們稱其為clr_fl。

比較fsync和fdatasync與O_SYNC標志,fsync和fdatasync在我們需要時更新文件內容,O_SYNC標志則在我們每次寫至文件時更新文件內容。

fcntl的必要性:我們的程序在一個描述符(標準輸出)上進行操作,但是根本不知道由shell打開的相應的文件名。因為這是shell打開的,于是不能在打開時,按我們的要求設置O_SYNC標志。fcntl則允許僅知道打開文件描述符時可以修改其性質。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性欧美办公室18xxxxhd| 亚洲人成在线观| 97国产精品免费视频| 中文字幕亚洲无线码在线一区| 日韩精品久久久久| 国产精品第三页| 97国产精品免费视频| 91亚洲精华国产精华| 久久久www成人免费精品张筱雨| 国产精品精品久久久| 91av成人在线| 欧美日韩在线一区| 在线观看91久久久久久| 91精品久久久久久| 国a精品视频大全| 亚洲人成网站在线播| 国产精品人成电影| 亚洲日韩第一页| 欧美精品久久久久久久免费观看| 欧美华人在线视频| 国产精品久久久999| 欧美又大又硬又粗bbbbb| 亚洲精品视频在线播放| 欧美理论在线观看| 国产成人精品a视频一区www| 久久777国产线看观看精品| 日韩av观看网址| 在线色欧美三级视频| 久久激情视频久久| 国产精品高潮呻吟久久av野狼| 91精品国产乱码久久久久久久久| 97婷婷涩涩精品一区| 97福利一区二区| 久久这里有精品视频| 精品久久久在线观看| 亚洲午夜久久久影院| 欧美大尺度电影在线观看| 成人中文字幕+乱码+中文字幕| 98精品国产高清在线xxxx天堂| 亚洲欧洲免费视频| 国产精品九九久久久久久久| 精品欧美国产一区二区三区| 日韩成人在线免费观看| 国产精品美女久久| 午夜精品一区二区三区视频免费看| 国产成人一区二区三区| 欧美激情在线观看视频| 亚洲欧美在线免费观看| x99av成人免费| 九九视频这里只有精品| 亚洲精品欧美日韩专区| 国产精品久久久久久久久久99| 亚洲18私人小影院| 成人性生交大片免费看视频直播| 美女啪啪无遮挡免费久久网站| 国产美女搞久久| 亚洲精品一区av在线播放| 日韩网站在线观看| 国产一区二区在线免费视频| 欧美日韩亚洲天堂| 日韩高清免费在线| 日本一区二区在线免费播放| 国产欧美精品日韩精品| 一区二区亚洲精品国产| 欧美精品videosex极品1| 国产成人福利视频| 亚洲午夜色婷婷在线| 国产午夜精品视频| 久久久久久久影视| 色婷婷av一区二区三区在线观看| 日韩欧美aⅴ综合网站发布| 中文字幕不卡在线视频极品| 亚洲国产精品嫩草影院久久| 超碰91人人草人人干| 亚洲人成电影在线观看天堂色| 国产美女久久精品香蕉69| 日韩视频亚洲视频| 亚洲美女中文字幕| 国产精品日韩精品| 国产精品欧美激情在线播放| 久久久欧美一区二区| 国产美女直播视频一区| www.亚洲人.com| 成人福利免费观看| 亚洲成人av在线播放| 亚洲精品白浆高清久久久久久| 亚洲精品99久久久久中文字幕| 97超碰蝌蚪网人人做人人爽| 久久综合国产精品台湾中文娱乐网| 一区二区三区亚洲| 亚洲精品999| 国产美女精品视频免费观看| 欧美日韩中文字幕在线视频| 国产精品一区二区三区久久| 亚洲成人在线网| 福利视频一区二区| 亚洲精品国产精品乱码不99按摩| 国产成人精品电影| 中文字幕亚洲情99在线| 欧洲日本亚洲国产区| 在线视频中文亚洲| www.欧美精品一二三区| 91午夜理伦私人影院| 一级做a爰片久久毛片美女图片| 日韩国产精品一区| 91亚洲永久免费精品| 日韩精品视频在线播放| 国产丝袜精品视频| www高清在线视频日韩欧美| 在线成人激情视频| 97人洗澡人人免费公开视频碰碰碰| 日韩中文字幕欧美| 午夜精品美女自拍福到在线| 日韩成人xxxx| 亚洲永久免费观看| 亚洲第一中文字幕| 亚洲最大在线视频| 中文字幕日韩视频| 91精品国产乱码久久久久久久久| 亚洲免费伊人电影在线观看av| 91久久久精品| 精品国产乱码久久久久久天美| 亚洲午夜性刺激影院| 国产一区二区三区在线免费观看| 国产精品成熟老女人| 国产精品偷伦视频免费观看国产| 欧美激情啊啊啊| 欧美一区二区色| 91免费的视频在线播放| 欧美日韩国产va另类| 91av在线免费观看| 九九精品视频在线| 亚洲精品在线不卡| 国产精品美女主播在线观看纯欲| 3344国产精品免费看| 精品久久久久久电影| 亚洲成人av中文字幕| 亚洲精品成a人在线观看| 黑人巨大精品欧美一区二区一视频| 欧洲成人性视频| 岛国av一区二区| 精品国产一区二区三区久久狼黑人| 日韩精品视频在线观看免费| 久久久久久国产精品美女| 欧美大片在线看免费观看| 国产成人高清激情视频在线观看| 久久久亚洲成人| 久久亚洲精品国产亚洲老地址| 亚洲福利在线视频| 欧美成人午夜激情| 久久精品视频在线播放| 青青草原成人在线视频| 亚洲午夜未满十八勿入免费观看全集| 亚洲国产精品高清久久久| 欧美日韩国产一区二区三区| 国产亚洲福利一区| 国产精品盗摄久久久| 狠狠久久五月精品中文字幕| 国产精品免费观看在线| 国产精品亚洲аv天堂网| 国产精品视频资源| 美女扒开尿口让男人操亚洲视频网站| 中文字幕日韩综合av| 久久精品视频在线观看|