文件标识符及Linux下的文件相关调用接口

在我们运行C程序的时候,C会为我们默认打开三个输入输出流,分别是stdin,stdout,stderr。

通过查阅man手册可以得知,这三个流的类型都是FILE*,fopen返回值类型是文件指针。

打开文件的类型一般有r,r+,w,w+,a,a+这些读写和追加这几种对文件的操作方式。

FILE *fp = fopen("filename""w");
const char* msg = "hello, myfile";
fwrite(msg, strlen(msg), 1,fp);

我们可以用这样的传参方式,把msg中的消息写入myfile文件中。

这里的参数msg我们可以看出来是消息内容,strlen(msg)是消息长度,1是要写入一个长度为strlen(msg)的消息,fp是文件指针。

但我们今天要了解的不是C库中的IO,而是系统调用下的IO,在Linux下,想要对文件操作,首先得拿到该文件的文件描述符。

而文件描述符如何拿到呢?先来看看这段代码~

int fd = open("myfile", O_RDONLY);
    if(fd < 0){
        perror("open");
        return 1;
    }

    const char* msg = "Hello world\n";
    char buf[1024]; 

    while(1){
        ssize_t s = read(fd, buf, strlen(msg));
        if(s > 0){
            printf("%s", buf);
        }else{
            break;
        }
}

这里的open就是系统提供的接口,与C语言当中的fopen很类似,但fopen是C标准库当中的函数,我们称之为C库函数。可以认为,fopen,fwrite,fread,fclose等C库函数是对open,write,read,close的二次封装。

而open的返回值fd就是我们想要找的文件描述符。我们可以看到,在调用read函数的时候,我们把fd当做参数传进去了,buf是我们一次可以读取的长度,第三个参数是我们需要读取的消息长度,而返回值s则是实际读取到的长度。

这里的fd一般情况下是3,因为Linux进程默认情况下会缺省打开3个文件描述符,分别的标准输入0,标准输出1,标准错误2。0,1,2对应的物理设备一般是:键盘,显示器,显示器。

也就是说,我们是通过文件描述符,对文件进行相关操作的,假如代码的前面加上close(1),那么fd是多少呢?这里的答案是1,因为文件描述法的分配规则是从小到大依次分配没有使用的文件描述符,我们上面提到1对应的是标准输出,那么我们在此关闭了标准输出,我们的对文件进行相关操作还能输入到屏幕上吗?当然是不能了,不信的话,你可以试试^_^

猜你喜欢

转载自blog.csdn.net/zym1348010959/article/details/80384372