Linux C编程学习笔记(2):open、creat、close函数及文件的创建、打开与关闭

my_create.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>  //根据errno值的不同来确定具体的错误类型

int main()
{
    int fd;

    if((fd=open("example_1.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR))==-1)
    //if(creat("example_1.c",S_IRWXU)==-1)
    {
        perror("open");
        //printf("open:%s with errno:%d\n",strerror(errno),errno);
                                      //从错误代码获取相应的错误描述
        exit(1);
    }
    else
    {
        printf("create file success\n");
    }
    close(fd);

    return 0;
}

编译该程序,发现代码没有错误。
执行两次。
这里写图片描述
第一次执行成功创建文件example_1.c,权限为所有者可读可写。
这里写图片描述
第二次执行表示文件已存在。这是因为在调用open时,同时设置了O_CREAT和O_EXCL标志,则当文件存在时,open调用失败,系统将错误代码设置成EEXIST,表示文件已存在。

如果把“perror(“open”);”注释掉,把下一行取消注释,重新编译并运行程序:
这里写图片描述
这种方法可以得到错误描述。

如果把open注释掉,把creat取消注释,则第二次执行不会报错。这是因为creat,对于存在的文件它用新文件将其覆盖。
这里写图片描述


open函数

1.原型
  #include<fcntl.h>
  int open(const char *pathname, int flags); 
  int open(const char *pathname, int flags, mode_t mode);
2.功能

  打开或建立一个文件。对于open函数,仅当创建文件时,才用到第三个参数。

3.参数

  ① pathname:打开或创建的文件名
  ② flags:用下列一个或多个常量进行“或”运算构成flags参数(这些常量定义在fcntl.h中)
     O_RDONLY   只读打开
     O_WRONLY   只写打开
     O_RDWR    读写打开
   以上三个常量只能选一个,下面的则可以多选:
     O_CREAT  若此文件不存在,则创建它。使用此选项时,需要第三个参数mode,用其指定新文件的访问权限。
     O_EXCL  如果同时制定了O_CREAT,而文件已经存在,则会报错。因此可以测试一个文件是否存在,如果不存在,则创建此文件,这使测试和创建两者成为一个原子操作。
     O_TRUNC  如果此文件存在,而且以可写方式打开,则将文件长度清为0。即原文保存数据丢失,但属性不变
     O_APPEND  每次写时都追加到文件的尾端。
   等等….
  ③ mode:用下列一个或多个常量进行“或”运算构成mode参数(这些常量定义在sys/stat.h)
     S_IRWXU:00700  文件所有者读写执行权限
     S_IRUSR: 00400  文件所有者读权限
     S_IWUSR:00200  文件所有者写权限
     S_IXUSR: 00100  文件所有者执行权限
     S_IRWXG:00070  用户组读写执行权限
     S_IRGRP: 00040  用户组读权限
     S_IWGRP:00020  用户组写权限
     S_IXGRP: 00010  用户组执行权限
     S_IRWXO:00007  其他用户读写执行权限
     S_IROTH: 00004  其他用户读权限
     S_IWOTH:00002  其他用户写权限
     S_IXOTH: 00001  其他用户执行权限


creat函数

1.原型
  #include<fcntl.h>
  int creat(const char *pathname, mode_t  mode);
2.功能

  创建一个新文件。creat函数等效于:

  open(pathname,O_WRONLY | O_CREAT | O_TRUNC, mode)**

  注意:creat只能以只写方式打开,不能读,读出的将是乱码!

3.参数

  ① pathname:创建的文件名
  ② mode:与open的mode相同


close函数

1.原型
  #include <unistd.h>
  int close(int fd);    
2.功能

  关闭一个已经打开的文件。

3.参数

  表示需要关闭的文件描述符。该描述符由open或creat函数得到。


perror函数

1.原型
  perror (const char *s);
2.功能:  

  将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照变量errno 的值来决定要输出的字符串。
  在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用“某些”函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。
  如果想看到errno的值,则将

perror("open");

  替换为:

printf("open:%s with errno:%d\n",strerror(errno),errno);  

strerror函数

功能

  把error对应的描述符转化为对应的字符串。
  例如error值为17,则 strerror(error)返回17这个描述符对应的字符串。

头文件:string.h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值