关于linux下creat函数的使用后read出现:Bad file descriptor

来源:互联网 发布:刘润5分钟商学院 知乎 编辑:程序博客网 时间:2024/05/16 14:13

在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函数就可以了。

原创粉丝点击