Linux下的fd和fp

这篇博客探讨了在Linux环境下,文件描述符(fd)和流(fp)的区别与联系。文章指出,文件描述符是操作系统用于跟踪打开文件的标识,而流是C标准库提供的对fd操作的封装,具有I/O缓存。fopen函数内部调用了open系统调用来打开文件,并返回FILE结构指针。文件描述符0、1、2分别对应stdin、stdout和stderr,关闭或重定向它们会影响程序的行为。C库中的缓冲区管理在stdio函数如printf和fwrite中起到关键作用,影响数据的输出和进程间的复制。
摘要由CSDN通过智能技术生成

这里写图片描述
通常我们写一个C程序在C标准库上进行一系列的编程,但是在c程序里如果我们要打开一个文件,我们都知道文件开始是存在硬盘上的,而操作文件是通过操作系统的。
那么我们就需要通过操作系统暴露的一些接口去间接的操作文件,而系统调用就是操作系统向外暴露的接口。
文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用;
而流(如: fopen)返回的是一个FILE结构指针, FILE结构是包含有文件描述符的,FILE结构函数可以看作是对fd直接操作的系统调用的封装, 它的优点是带有I/O缓存

#include<stdio.h>
#include<string.h>
int main()
{

     FILE*fp=fopen(".log","w");
     const char*msg="hello word!\n";
     if(fp==NULL)
     {
       perror("open");
        return 1;
     }
    int i=0;
     while(i<10)
     {
          fwrite(msg,1,strlen(msg),fp);
          i++;
     }
     fclose(fp);
     return 0;
}

但是此时我们打开文件使用的是fopen,而fopen是库函数,因此我们可以知道在fopen这个函数里是封装了系统调用函数open的,通过在fopen里调用open来打开文件。
FILE *fopen(const char *path, const char *mode);

 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 int open(const char *pathname, int flags);

第一个参数和fopen一样,都是要打开的文件名或者路径,第二个参数是选择以什么方式打开(只读?只写?读写?)
int open(const char *pathname, int flags, mode_t mode);
第一个参数和fopen一样,都是要打开的文件名,第二个参数是选择以什么方式打开(只读?只写?读写?),第三个参数mode表示ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值