open函數的使用

簡述:open是UNIX系統(包括LINUX、Mac等)的系統調用函數,區別於C語言庫函數fopen。

#include<fcntl.h>
#include<unistd.h>
int open(constchar*pathname,intflags);
int open(constchar*pathname,intflags,mode_t mode);

返回值:成功則返回文件描述符,否則返回-1

函數參數:
pathname:打開文件的路徑名
flags:用來控制打開文件的模式
mode:用來設置創建文件的權限(rwx)。當flags中帶有O_CREAT時纔有效。
返回值:
調用成功時返回一個文件描述符fd
調用失敗時返回-1,並修改errno

flags參數詳解: O_RDONLY:只讀模式 O_WRONLY:只寫模式 O_RDWR:可讀可寫模式
上面三種模式在flags參數中不能同時出現但必須有一種出現,下面的參數是可選的。
O_APPEND:以後每次寫文件時都會先將當前文件偏移量設置到文件末尾,但是讀文件時時不影響的
O_CREAT:如果文件不存在則創建,需要使用mode選項。來指明新文件的訪問權限
O_EXCL:要打開的文件如果存在則出錯,必須要和O_CREAT參數一起使用 O_TRUNC:打開文件的同時將文件中的內容清除
O_NOCTTY:如果打開的文件是終端設備,則不將此設備設置爲進程的控制終端
O_NONBLOCK:如果打開的文件是一個管道、一個塊設備文件或一個字符設備文件,則後續的I/O操作均設置爲非阻塞方式
O_SYNC:使每次write都等到物理I/O操作完成,包括由該write操作引起的文件屬性更新所需的I/O。

open函數返回的文件描述符fd一定是未使用的最小的文件描述符。利用這個特性,可以改變0,1,2這三個文件描述符所指向的文件,由於進程默認會打開0,1,2這三個文件描述符,而且指向了鍵盤和顯示器的設備文件。如果在open之前先進行close(1),然後再調用open函數就會返回最小的未使用的fd,也就是1。

如果文件不存在,而且又使用了O_CREAT標誌,也就是會創建文件,創建文件時會給文件一定的權限,但是這個權限並不會限制該進程後面對該文件的操作。舉個例子,如果創建文件時給的權限是0555,也就是所有用戶都沒有寫的權限。但是程序後面還是可以對文件進行寫操作。

當mode參數是由八進制數字給出的時候,如 0777 .要糾正一個錯誤,就是之前我認爲 權限數字前面的 0 代表的是八進制的含義,其實並不是這樣的,前面的 0 代表了權限修飾位,也就是set-user-id位、set-group-id位和sticky這三位的權限。

fopen與open的區別
以可寫的方式fopen一個文件時,如果文件不存在則會自動創建,而open一個文件時必須明確O_CREAT纔會創建文件,否則文件不存在就出錯返回

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>

int main()
{
        int fd;
        const char *msg = "hello open";
        char buf[128] = {0};
        fd = open("test.txt", O_WRONLY|O_CREAT|O_APPEND, 0666);
        if(fd < 0)
        {
                perror("open");
                exit(1);
        }

        write(fd, msg, strlen(msg));
        close(fd);
        fd = open("test.txt", O_RDONLY);
        if(fd < 0)
        {
                perror("open");
                exit(1);
        }
        read(fd, buf, sizeof(buf));
        printf("read: %s", buf);
        return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章