F_GETFL
---------------------------------------------
將文件狀態標誌做爲函數值返回。
文件狀態標誌:
O_RDONLY O_WRONLY O_RDWR
O_APPEND O_NONBLOCK O_SYNC FASYNC(O_ASYNC)
三個存取方式標誌(O_RDONLY, O_WRONLY, O_RDWR)是互斥的,一個文件只能有這三種值的其中一個。首選須要用屏蔽字O_ACCMODE取得存取方式位,而後將結果與這三個標誌相比較。
F_SETFL
---------------------------------------------
將文件狀態標誌設置爲第三個參數的值,能夠更改的幾個標誌是:O_APPEND, O_NONBLOCK, O_SYNC, FASYNC(O_ASYNC)
注:
當一個打開的文件FASYNC標誌變化時(調用fcntl()函數,設置FASYNC文件標誌時),該文件所對應的設備驅動的fasync()接口將被調用。
---------------------------------------------
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int fd, val, accmode;
if (argc != 2) {
printf("usage: ./a.out filename\n");
return -1;
}
if ((fd = open(argv[1], O_RDWR)) < 0) {
perror("open error");
return -1;
}
if ((val = fcntl(fd, F_GETFL)) < 0) {
perror("fcntl error");
return -1;
}
accmode = val & O_ACCMODE;
if (accmode == O_RDONLY) printf("read only\n");
else if (accmode == O_WRONLY) printf("write only\n");
else if (accmode == O_RDWR) printf("read write\n");
else printf("unknown access mode\n");
if ((val = fcntl(fd, F_SETFL, val | FASYNC | O_NONBLOCK)) < 0) {
perror("fcntl error");
return -1;
}
if ((val = fcntl(fd, F_GETFL)) < 0) {
perror("fcntl error");
return -1;
}
//if (val & O_ASYNC)
if (val & FASYNC)
printf("async\n");
if (val & O_NONBLOCK)
printf("nonblocking\n");
}async