Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55558
  • 博文数量: 22
  • 博客积分: 1546
  • 博客等级: 上尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-20 20:33
文章分类
文章存档

2010年(22)

分类: C/C++

2010-07-20 20:39:32

creat()和open()都可以创建文件,但是稍有区别。如果按照如下方式设置参数则两者是等价的:

open(const char* pathname, (O_CREAT|O_WRONLY|O_TRUNC),mode_t mode);
creat(const char* pathname,mode_t mode);

若要创建的文件不存在,则按照mode方式创建新文件。当要创建的文件已经存在到时候,覆盖原有文件。事实上是因为O_WRONLY|O_TRUNC参数的原因:当文件存在并且以可写方式打开的时候,原有文件到长度则清0,即会清空原有文件,但是文件属性不变,与原有文件方式相同,并不会设置成mode方式。

在下面的源代码中,以open函数方式创建文件时,由于设置拉O_CREAT|O_EXCL参数,当要创建到文件不存在时,open函数创建这个文件,并且文件到存取权限为S_IRUSR|S_IWUSR。当文件存在时因为设置拉O_EXCL则出现错误。而当以creat()方式创建文件时,如本文开头所述,无论是否存在将要创建的那个文件,都不会出现错误。

下面作测试。

首先注意,在下面的源代码中open()函数中的文件权限s设置为:S_IRUSR|S_IWUSR(文件所有着可读可写)。creat()设置的文件权限为:S_IRWXU(文件所有者可读可写可执行)。

第一次运行本程序,选择使用open()创建example_62.c。

please select a way of creating files:
1.creat 2.open
2
create file success
edsionte@edsionte-laptop:~/code$ ls -l
总用量 48
-rw------- 1 edsionte edsionte 0 2010-06-16 12:38 example_62.c

第二次运行本程序,以creat()创建文件,依然会运行成功,但是此时的example_62.c的存取权限是否是creat()中设置的S_IRWXU呢?

edsionte@edsionte-laptop:~/code$ ./my_create
please select a way of creating files:
1.creat 2.open
1
create file success
edsionte@edsionte-laptop:~/code$ ls -l
总用量 48
-rw------- 1 edsionte edsionte 0 2010-06-16 12:40 example_62.c

正如上面所述的,creat()创建已存在的文件,并不会更改原文件的属性。

源代码如下:

#include "stdio.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "unistd.h"
#include "error.h"

int main()
{
    int fd,n;
    printf("please select a way of creating files:\n");
    printf("1.creat 2.open\n");
    scanf("%d",&n);
    if(n==1)
    {
        if((fd=creat("example_62.c",S_IRWXU))==-1)
        {
            perror("open");
            exit(1);
        }
        else
        {
            printf("create file success\n");
        }
    }
    else if(n==2)
    {
        if((fd=open("example_62.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR))==-1)
        {
            perror("open");
            exit(1);
        }
        else
        {
            printf("create file success\n");
        }
    }
    else
    {
        printf("your choice may be wrong\n");
    }
    close(fd);
    return 0;
}


阅读(947) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:传送门

给主人留下些什么吧!~~