在linux下很大一部分人创建文件的时候很少用creat了,大部分都用open来代替,其实这样是完全可以的因为creat函数就等价于下面的open函数:
open(const char * pathname, (O_CREAT|O_TRUNC|O_WRONLY));
其实要是仔细看这个open函数也就能发现,为啥用creat创建的文件,在进行读操作会出现errno:9 Bad file descriptor的错误。
一开始我就单纯的以为那个O_WRONLY可以随便的换成O_RDONLY或者O_RDWR呢,但是其实不是那样的,
creat函数的返回值就是如果成功返回一个只写的文件描述符,主意“只写”的,失败返回-1;
也就是说,对这个文件做读操作的就会出错,如下例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
extern int errno;
void my_err(char * str_string, int line)//自己定义的出错处理函数
{
fprintf(stderr, "line:%d...errno:%d", line, errno);
perror(str_string);
exit(1);
}
int main(void)
{
int fd, ret;
char read_buf[64];
char write_buf[32] = "Hello World!";
if((fd = creat("text.c",S_IRWXU)) == -1)//创建text.c文件
{
my_err("creat", __LINE__);
}
if(write(fd, write_buf, strlen(write_buf)) < 0)
{
my_err("write", __LINE__);
}
if((ret = read(fd, read_buf,32)) < 0){
my_err("read", __LINE__);
}
for(int i = 0; i < ret; i++)
printf("%c", read_buf[i]);
printf("\n");
return 0;
}
gcc -o creat creat.c -std=c99 -Wall
./creat会出现如下错误
line:33...errno:9read: Bad file descriptor
所以大家要注意,creat函数返回的文件描述符,只可做写操作,不可做读操作,如果要进行读操作,可用open重新打开,或者创建的时候直接用open函数就可以了。