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这个描述符对应的字符串。