fcntl()

 

fcntl()

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

相關文章
相關標籤/搜索