这是我的代码:
#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;
}
当我运行程序时,会发生奇怪的事情。每次运行文本文件的模式都不同(为了测试创建功能,我在运行程序后运行文本文件)。那么,为什么会这样呢?
答案 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)来理解它正在进行的系统调用。