creat open 系统调用

Posted grb2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了creat open 系统调用相关的知识,希望对你有一定的参考价值。

creat:

创建文件,显然参数只需要(路径path,权限mode)。 

1、如果文件存在怎么办?直接覆盖掉!不管你里面有没有内容。

#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include<iostream>
using namespace std;
int main()
{
        int fd;
        //umask(0000);
        fd=creat("grb.txt",0777);
        if(fd==0)
                cout<<"create failed!\\n";
        else
                cout<<"create successful!\\n";
}

  

创建成功,但是有个问题。

给的权限八进制777最大权限,但是查看权限的并不是。

 

此处设定的mode的值并不是文件最终的权限,文件最终的权限是按照mode & ~umask得到的,而默认的umask是0022,所以如果想按照mode的值设置文件权限,需要在建立文件之前将umask的值设置为0000。加一句umask(0000),即可。
 
 
 
open:
我们先自己分析一下open需要提供哪些功能。
1、要打开一个文件,显然要给出路径path,还有打开方式flag(只读、只写、可读可写).
     文件的打开方式跟权限是有区别的,比如文件的user拥有所有权限,但是它也可以只读打开文件,有权限我不一定用。
2、如果打开的文件不存在怎么办?应该要file not exit !报错。还应该提示是否创建这样一个新的文件,这时候需要第三个参数mode,表示新创建的文件的权限。
 
总结一下Linux中creat与open的用法:
 
关于新建文件:

使用create函数:
    创建一个文件,如果用creat(path ,mode )函数,则为只写。因为creat的返回值也是一个fd。所以你可以紧接着用这个fd,但是只能写!
 
1、文件不存在时候:创建一个新文件。只写。
 
2、文件存在时,直接清零,不管之前的文件是否有内容。
 
相当于open(path,O_WRONLY|CREAT|O_ TRUNC,0777)
 
用open可以随心所欲:
  1. 文件不存在,可创建只读、只写、或者可读可写的文件
  2. 文件存在时,可以将其清0,或者追加。
  3. 文件存在时,可报错 file exits!
 
所以,所以可以完全不用create,以后就用open来进行创建。
 
关于打开文件:
打开文件只能用open函数。
       返回一个fd,对打开的而文件, 有只读、只写、可读可写三种基本方式。
         其它还有:  
         追加方式,O_APPEND如果不设置的话,就会从头开始写。
         清零,每次写的时候,先清零(这个只在只写方式下有效)。
 
几个实例
1、创建 一个文件,并给予最大权限,如果文件已经存在,则报错。(O_EXCL  O_CREAT的用法)
#include<stdio.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
        umask(0000);
        int fd=open("guo0.txt",O_EXCL|O_CREAT,0777);//新建一个文件,并给予最大权限,若存在则报错。
        if(fd==-1)
        {
                printf("creat failed!\\n");
        }
        else
        {
                printf("creat successful!\\n");
        }
        close(fd);
        return 0;
}
 
 
2、打开  以读写方式打开一个文件,若该文件不存在,不创建,直接退出。

以上是关于creat open 系统调用的主要内容,如果未能解决你的问题,请参考以下文章

文件管理-第一节6:文件基本操作

对 ios7 的 shm_open 调用现在导致在 O_CREAT (EPERM) 期间不允许操作

pb11.5发布web Services的应用报错“cannot create rantime when another painter is open”如何解决

如果文件不是以sudo方式打开,系统调用open C不能打印文件内容

C# File.Open 使用 FileMode.Create 的只读文件

等效于 GLib 中的 open(O_WRONLY | O_CREAT)?