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

发布了37 篇原创文章 · 获赞 35 · 访问量 3576

猜你喜欢

转载自blog.csdn.net/qq_43799957/article/details/105177644
今日推荐