1

这是我的代码:

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

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

4

1 回答 1

2

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

 #define FILE "./test.txt"

不合适(与FILEfrom冲突<stdio.h>),应该是

 #define FILE_NAME "./test.txt"

然后

 if((fd=open(FILE,O_EXCL|O_CREAT))==-1)

是错的。open(2)需要第三个模式O_CREAT参数(至少在传递时)。

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

传递了一些垃圾而不是缺少的第三个参数(这解释了不可重现的未定义行为)。试试吧

 fd = open(FILE_NAME, O_EXCL|O_CREAT, 0640);
 if (fd < 0)

顺便说一句,您还可以在程序上使用strace(1)来了解它正在执行的系统调用。

于 2013-10-09T05:09:06.573 回答