创建文本文件时出现问题

时间:2013-10-09 04:48:47

标签: c linux file-io

这是我的代码:

#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define FILE "./test.txt"
char buf[20]="Hello, World!";
int main()
{
    int fd;
    if((fd=open(FILE,O_EXCL|O_CREAT))==-1)
    {
        printf("File Already EXIST!\n");
        if((fd=open(FILE,O_RDWR))==-1)
        {
            perror("open error");
            exit(1);
        }
    }
    else 
    {
        if((fd=open(FILE,O_RDWR|O_CREAT,0666))==-1)
        {
            perror("create error");
            exit(1);
        }
    }
    if(write(fd,buf,sizeof(buf))==-1)
    {
        perror("write error");
        exit(1);
    }
    else printf("Write Done.\n");
    return 0;
}

当我运行程序时,会发生奇怪的事情。每次运行文本文件的模式都不同(为了测试创建功能,我在运行程序后运行文本文件)。那么,为什么会这样呢?

1 个答案:

答案 0 :(得分:2)

您应该编译所有警告和调试信息(gcc -Wall -g)。

 #define FILE "./test.txt"

不合适(与FILE的{​​{1}}冲突),应该是

<stdio.h>

然后

 #define FILE_NAME "./test.txt"

错了。 open(2)需要第三个模式参数(至少传递 if((fd=open(FILE,O_EXCL|O_CREAT))==-1) 时)。

内核在创建任何文件时需要一种模式,例如: O_CREAT open O_CREAT。打开现有文件时,该模式是无用的,因此被记录为不需要,但是无用的东西被传递给内核。

传递了一些垃圾而不是丢失的第三个参数(这解释了不可重现的undefined behavior)。尝试改为

 fd = open(FILE_NAME, O_EXCL|O_CREAT, 0640);
 if (fd < 0)
顺便说一句,您也可以在程序中使用strace(1)来理解它正在进行的系统调用。