|
lienhua34 fcntl 函數(shù)可以改變已打開的文件的性質(zhì)。
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,
三個(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)志說明。 #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); } 編譯該程序,生成 flprinter,然后運(yùn)行該文件, 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 (done) |
|
|