基础IO口

文章详细介绍了C语言中文件操作的基本函数,如fopen、fwrite、fread、fclose和fseek,它们是对系统调用如open、write、read、close的封装。同时,文章提到了文件描述符、权限模式、缓冲区的概念,并讨论了重定向的本质。此外,还阐述了动态库和静态库的生成与使用,包括编译选项-fPIC和--shared,以及链接库时的-l和-L选项。
摘要由CSDN通过智能技术生成
文件的操作:
c语言:fopen--打开文件,返回文件的操作句柄,有了句柄才能对指定文件进行操作。
   fwrite--向文件写入数据
   fread--向文件读取数据
   fclose--关闭文件
   fseek--跳转当前读写位置

以上都是库函数,而库函数都是对系统调用接口的封装,让接口更好用。

 系统调用接口:open,write,read,close,lsee     

 open 接口 

   int open(const char *pathname, int flags);                                                                                          int open(const char *pathname, int flags, mode_t mode);

pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行 运算,构成 flags
参数 :
 必选项:     O_RDONLY: 只读打开     O_WRONLY: 只写打开       O_RDWR : 读,写打开
      这三个常量,必须指定一个且只能指定一个                                                                                  可选
      O_CREAT : 若文件不存在,则创建它。需要使用 mode 选项,来指明新文件的访问权限
      O_APPEND: 追加写
      O_TRUNC:截断文件-丢弃原有数据
mode_t理解:当 O_CREAT被使用的时候,就要设置第三个参数model,用于设定被创建文件访问权限0664    0664--需要特别注意,前面的0不能省略,会影响权限位的设置。
给定的权限不一定是实际得到的权限,实际的文件权限会收到~umask的影响
实际得到的权限=给定的权限&(umask)
umask(model_t  mask)设置当前调用的进程的掩码.
返回值: 成功:新打开的文件描述符作为操作句柄,失败返回-1;

库函数是对系统调用接口的封装,printf将数据写入显示器文件,但不仅仅是写入,还包含了数据格式化(将多个数据按照指定格式组织成为一个字符串再写入)                                                        库函数fopen,fwrite,fread,fclose都是对系统接口open,write,read,close,lsee接口的封装。

向文件写入数据,数据不会立即被写入文件,而是先写入缓冲区,等刷新缓冲区的时候写入文件。对系统调用接口来说,本质上是没有这个缓冲区的。所以write向显示器写入数据是直接打印,而printf,fprintf,fwrite是刷新缓冲区的时候才打印。最基础的文件流结构指针对文件描述符做的改进:添加了缓冲区。

 

 文件描述符:被打开的文件的操作句柄--是一个非负整数

   1.当我们打开了一个文件,涉及到对应设备的操作

   2.用一个结构体将这个设备描述起来(磁盘文件。就是描述操作是那一块硬盘的多少数据。以及         权限)一个进程可能会打开很多文件,这些文件信息就需要组织起来(本质上使用一个数组)

重定向的本质:

就是将一个描述符所对应位置的文件描述信息,给替换成另一个文件的描述,这就实现了在不做其他逻辑改变的情况下,改变了所操作的文件。

动态库与静态库的生成与使用:                                                                                                               库文件:将已经实现的代码进行打包,并不是为了生成可执行程序,而是为了给其他人提供接口使用                                                                                                                                                      动态库:以位置无关代码打包

     动态链接:生成可执行程序的时候,链接动态库,记录库中的符号表,生成的程序小,并且多个程序运行时在内存可以共享使用同一个动态库,运行更依赖动态库的存在,因为是运行程序的时候才会将动态库加载到内存中。

     静态链接:生成可执行程序的时候,链接静态库,直接将库中所用到的函数的实现,拿到可执行程序中,不存在运行依赖,效率较高,但生成的可执行程序比较大,如果运行了多个用到同一个静态库的程序,则有可能库中代码在内存中有多份冗余。

生成库:把大量已经实现的代码打包起来

1.先把所有的源码进行编译汇编生成各自的二进制指令                                                                                 gcc  child.c -o child.o

2.将所有的生成的二进制文件给打包到一起                                                                                               linux下的动态库命名:以Lib为前缀,以.so为后缀,中间是库名。

      动态库:gcc --shared child.o -o libmychild.so                                                                                                  gcc -fPIC -c child.c -o child.o                                                                                                              gcc --shared child.o -o libmychild.so                                                                                               -fPIC:告诉编译器,在编译生成指令的时候产生与位置无关的代码(变量指令的地址都是相对偏移量)                                                                                                                                                -c:只进行预处理,编译,汇编结束后退出                                                                                         --shared:告诉编译器,生成的是一个库文件,而不是可执行程序

      静态库:linux下的动态库命名:以Lib为前缀,以.a为后缀。                                                                ar  -cr                                                                                                                                                 gcc -c child.c -o child.o                                                                                                                       ar -cr  libmychild.a child.0      

使用库:使用-l来告诉编译器要使用那个库 gcc  main.c -o main -lmychild                                                    但是会报错,因为编译器回到系统指定目录下(/user/lib64)查找这个库 

 方法:                                                                                                                                           1:将库文件放到指定路径下:64位系统-/user/lib64         32位系统 -/user/lib                                     2:设置环境变量:export LIBRARY_PATH=${LIBRARY_PATH}:./将库文件所在目录添加在环境变量中。export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./ 添加运行加载库文件的路径               3.使用gcc -L选择,指定库文件所在路径:gcc main.c -o main -L./-lmychild

这种方法只适合在指定路径下,链接静态库,因为无法设置运行程序时的库加载路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值