小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

UNIX環(huán)境編程學(xué)習(xí)筆記(5)

 戴維圖書館 2018-06-28

lienhua34
2014-08-29

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

#include <fcntl.h>

int fcntl(int filedes, int cmd, ... /* int arg */);

fcntl 函數(shù)有 5 種功能:

1. 復(fù)制一個(gè)現(xiàn)有的描述符(cmd=F_DUPFD)。

2. 獲取/設(shè)置文件描述符標(biāo)志(cmd=F_GETFD 或F_SETFD)。

3. 獲取/設(shè)置文件狀態(tài)標(biāo)志(cmd=F_GETFL 或F_SETFL)。

4. 獲取/設(shè)置異步 I/O 所有權(quán)(cmd=F_GETOWN 或F_SETOWN)。

5. 獲取/設(shè)置記錄鎖(cmd=F_GETLK、F_SETLK 或F_SETLKW)。

下面說明一下前五個(gè) cmd 值。

(1)F_DUPFD

復(fù)制文件描述符 filedes。新文件描述符作為函數(shù)值返回。跟 dup 函數(shù)的區(qū)別是:dup 函數(shù)返回的新文件描述符一定是尚未打開的描述符中最小的,而 fcntl 函數(shù)返回的新文件描述符是尚未打開的描述符中大于或等于第三個(gè)參數(shù)中各值的最小值。即 dup(filedes) 等價(jià)于 fcntl(filedes, F_DUPFD, 0)

(2)F_GETFD

獲取 filedes 的文件描述符標(biāo)志作為函數(shù)值返回。當(dāng)前只定義了一個(gè)文件描述符標(biāo)志FD_CLOEXEC(FD_CLOEXEC 即“執(zhí)行時(shí)關(guān)閉”標(biāo)志,設(shè)置了該標(biāo)志,表示在執(zhí)行一個(gè) exec 時(shí)自動(dòng)關(guān)閉該描述符。復(fù)制一個(gè)文件描述符時(shí)自動(dòng)清除該標(biāo)志,無論使用的是 dup 函數(shù)還是 fcntl 函數(shù)。)

(3)F_SETFD

設(shè)置 filedes 文件描述符標(biāo)志。

(4)F_GETFL

獲取文件描述符 filedes 的文件狀態(tài)標(biāo)志作為函數(shù)值返回。文件狀態(tài)標(biāo)志見表格 1,

文件狀態(tài)標(biāo)志  說明
O_RDONLY 只讀打開
O_WRONLY 只寫打開
O_RDWR 為讀、寫打開
O_APPEND 每次寫時(shí)追加
O_NONBLOCK 非阻塞模式
O_SYNC 等待寫完成(數(shù)據(jù)和屬性)
O_DSYNC 等待寫完成(僅數(shù)據(jù))
O_RSYNC 同步讀、寫

三個(gè)訪問方式標(biāo)志(O_RDONLY、O_WRONLY 以及O_RDWR)并不各占一位,這三個(gè)標(biāo)志的值分別為 0、1 和 2。因此需要必須使用屏蔽字O_ACCMODE 獲取訪問模式位,然后將結(jié)果與這三種值中任一種做比較。

(5)F_SETFL

將文件狀態(tài)標(biāo)志設(shè)置為第三個(gè)參數(shù)的值(取為整 型 值) 可 以 更 改 的 幾 個(gè) 標(biāo) 志 是:O_APPEND、O_NONBLOCK、O_SYNC、O_DSYNC 和O_RSYNC。

例子:

下面程序的第一個(gè)參數(shù)指定文件描述符,并對(duì)于該描述符打印其所選擇的文件狀態(tài)標(biāo)志說明。

復(fù)制代碼
#include <stdlih.h>
#include <stdio.h>
#include <fcntl.h>
int
main(int argc, char *argv[])
{
    int val;
    if (argc != 2) {
        printf("usage: a.out <descriptor#>");
        exit(-1);
    }
    if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0) {
        printf("fcntl error for fd %d", atoi(argv[1]));
        exit(-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");
        break;
    }
    if (val & O_APPEND) {
        printf(", append");
    }
    putchar('\n');
    exit(0);
}
復(fù)制代碼

編譯該程序,生成 flprinter,然后運(yùn)行該文件,

復(fù)制代碼
lienhua34:examples$ ./flprinter 0 < /dev/tty
read only
lienhua34:examples$ ./flprinter 1 > temp.foo
lienhua34:examples$ cat temp.foo
write only
lienhua34:examples$ ./flprinter 2 2>>temp.foo
write only, append
lienhua34:examples$ ./flprinter 5 5<>temp.foo
read write
復(fù)制代碼

(done)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多