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、创建一个文件,并给予最大权限,如果文件已经存在,则报错。

#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;
}

时间: 2024-10-16 09:39:17

creat open 系统调用的相关文章

linux内核文件IO的系统调用实现分析(open)

http://blog.chinaunix.net/uid-23969156-id-3086824.html 1.          引言      从事Linux环境工作2年有余,一直懵懵懂懂,1年前拜读了<莱昂氏UNIX源代码分析>一书,感觉自己的学习道路漫漫且修远.最近受chinaunix的精华文帖启发,拟将近来的部分内核调用分析笔记拿出来与各前辈先进共同探讨学习,以壮个人学习之路.      本部分主要讲述的是文件I/O操作的2.6.11内核版本实现,包括了主要的数据结构.宏定义和函数

Linux VFS数据结构

先说明一下,linux内核中各种数据结构也不停的在变,所以不同版本的内核各个数据结构的定义可能会差别很大,这一组关于linux 文件系统的文章中的代码都摘自linux-2.6.34.1. VFS依赖于数据结构来保存其对于一个文件系统的一般表示. 超级块结构:存放已安装的文件系统的相关信息 索引节点结构:对于文件信息的完全的描述 文件结构:存放一个被进程打开的文件的相关信息 目录项结构:存放有关路径名及路径名所指向的文件的信息 组成VFS的结构与一些操作相关联,这些操作可应用于有这些结构所表示的对

【UNIX环境高级编程】文件 IO 操作 - 基础函数 open close creat lseek write read 详解

博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) open 函数简介 open 函数解析 : -- 函数定义 : #include <fcntl.h> int open(const char *path, int oflag, ...); -- 函数作用 : 打开或者创建一个文件; -- 返回值 : 打开文件成功, 返回文件描述符; 如果失败, 返回

Linux系统调用列表(转)

以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的. 按照惯例,这个列表以man pages第2节,即系统调用节为蓝本.按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对个别本人稍觉不妥的地方作了一些小的修改,并对所有列出的系统调用附上简要注释. 其中有一些函数的作用完全

linux应用程序开发-文件编程-系统调用方式

在看韦东山视频linux驱动方面有一些吃力,究其原因,虽然接触过linux应用程序编程,但是没有深入去理解,相关函数用法不清楚,正好看到国嵌视频对这一方面讲的比较透彻, 所以把学习过程记录下来,也作为linux应用程序开发的一个系列吧! 文件编程有两种方式,一是系统调用方式,二是库函数调用. 前者依赖特定的平台,后者不依赖平台. 系统调用:创建 int creat(const char *filename,mode_t mode); filename:要创建的文件名 mode:创建模式 S_IR

linux系统调用函数

Linux应用编程学习笔记                                 周学伟 一.系统调用文件编程   1.文件打开函数 /***************************************************************************** 函数名:open 函数原型:int open(const char * pathname, int flags) int open(const char * pathname,int  flags,

【Linux&amp;Unix--open/close/write/read系统调用】

个人学习整理,如有不足之处,请不吝指教.转载请注明:@CSU-Max 系列博文: Linux&Unix学习第一弹 -- 文件描述符与权限  Linux&Unix学习第二弹 -- exec 与 fock 系统调用 Linux&Unix学习第三弹 -- open/close/write/read系统调用 在 Unix/Linux 系统中,文件是一个很重要的概念,本文将介绍 Linux 中和文件相关的几个重要的系统调用--open-close-write-read 系统调用. open系

linux下C++开发系列(六)——文件IO相关的系统调用

linux操作系统中,文件是最基本和最重要的抽象,linux遵循一切皆文件的理念.按照不同的属性,文件可以分为普通文件和特殊文件.特殊文件是以文件方式表示的内核对象,linux支持四种类型的特殊文件: 1.块设备文件 (例如硬盘设备) 2.字符设备文件(例如键盘设备) 3.命名管道 (主要是进程间通信使用) 4.Unix域套接字(主要是网络通信使用) linux系统对于文件的操作,提供了一系列的系统调用个,主要分为以下几类: 1.创建文件(creat) 2.打开文件(open) 3.读文件(re

系统调用

程序接口是OS专门为用户程序设置的,也是用户程序取得OS服务的唯一途径.程序接口通常是由各种类型的系统调用所组成的,因而,也可以说,系统调用提供了用户程序 和操作系统之间的接口,应用程序通过系统调用实现其与OS的通信,并可取得它的服务.系统调用不仅可供所有的应用程序使用,而且也可供OS自身的其它部分,尤其是命令处理程序使用.在每个系统中,通常都有几十条甚至上百条的系统调用,并可根据其功能而把它们划分成若干类.例如,有用于进程控制(类)的系统调用和用于文件管理(类).设备管理(类)及进程通信等类的