Linxu中的系統調用函數---open函數(詳解)

下面是man手冊的章節號
在這裏插入圖片描述
我們可以通過man手冊來查詢系統函數man 2 open

open函數

//頭文件:
       #include<fcntl.h>
       #include<sys/types.h>
       #include<sys/stat.h>
//功能:打開和創建文件(建立一個文件描述符,其他的函數可以通過文 件描述符對指定文件進行讀取與寫入的操作。)

原型

int open(const char*pathname,int flags);  //文件存在
int open(const char*pathname,int flags,mode_t mode);//文件不存在
參數說明:
1.pathname
  要打開或創建的目標文件
2.flags
  打開文件時,可以傳入多個參數選項,用下面的
  一個或者多個常量進行“或”運算,構成falgs
  參數:
  O_RDONLY:   只讀打開
  O_WRONLY:   只寫打開
  O_RDWR:     讀,寫打開
這三個常量,必須指定一個且只能指定一個,面的參數是可選的。
  O_CREAT:    若文件不存在,則創建它,需要使
              用mode選項。來指明新文件的訪問權限
  O_APPEND:   追加寫,如果文件已經有內容,這次打開文件所
              寫的數據附加到文件的末尾而不覆蓋原來的內容
 3.mode
   用來設置創建文件的權限(rwx)。當flags中帶有O_CREAT時纔有效。
   標誌	            說明	                         標誌	               說明	                            標誌	         說明
S_IRUSR 	文件屬主可讀  	S_IRGRP	     文件所在組可讀  	S_IROTH	其他用戶可讀
S_IWUSR	    文件屬主可寫	            S_IWGRP	     文件所在組可寫	        S_IWOTH	其他用戶可寫
S_IXUSR	    文件屬主可執行	        S_IWOTH	     文件所在組可執行	    S_IXOTH	其他用戶可執行

 4.返回值:
   調用成功時返回一個文件描述符fd
   調用失敗時返回-1,並修改errno

舉例

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
    int fd;
    //hello.c已存在
    fd = open("hello.c",O_RDWR);
    if(fd == -1){
        perror("open file");
        exit(1);
    }

    close(fd);
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
    int fd;
    //myhello.c文件不存在  權限777
    fd = open("myhello.c",O_RDWR | O_CREAT,0777);
    if(fd == -1){
        perror("open file");
        exit(1);
    }

    close(fd);
}

在open的參數中若文件不存在,創建文件是的權限並不是文件實際的權限,還需與本地掩碼結合。以上myhello.c爲例:
創建文件時權限是777,實際是
在這裏插入圖片描述
文件的實際權限 = 給定權限 & 本地掩碼(取反)
本地掩碼:查看命令umask
在這裏插入圖片描述
則上面myhello.c實際文件權限 = (111111111) & (~(000010010)) = 111101101

參考:https://blog.csdn.net/dangzhangjing97/article/details/79631173

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