C语言中目录操作和库的使用

访问目录-opendir

opendir函数用来打开一个目录文件:

#include<dirent.h>

DIR  *opendir(const char *name);

DIR  *fdopendir(int fd);使用文件描述符,要配合open函数使用

  • DIR是用来描述一个打开的目录文件的结构体类型
  • 成功时返回目录流指针;出错时返回NULL

访问目录-readdir

readdir函数用来读取目录流中的内容:

#include <dirent.h>

struct dirent  *readder(DIR  *dirp);

  • struct dirent 是用来描述目录流中一个目录项的结构体类型;
  • 包含成员char  d_name[256];
  • 成功时返回目录流dirp中下一个目录项;
  • 出错或者到末尾时返回NULL

 访问目录-closedir

closedir函数用来关闭一个目录文件:

#include <dirent.h>

int closedir(DIR  *dirp);

  • 成功时返回0;出错时返回EOF。

修改文件访问权限-chmod/fchmod

chmod/fchmod函数用来修改文件的访问权限:

#include <sys/stat.h>

int chmod(const char  *path,mode_t  mode);

int fchmod(int fd,mode_t mode);

  • 成功时返回0;出错时返回EOF;
  • root和文件所用者能修改文件的访问权限;
  • 示例:chmod("test.txt",0666);

获取文件属性-stat/lstat/fstat

stat/lstat/fstat函数用来获取文件属性:
#include <sys/stat.h>

int stat(const char *path,struct stat *buf);

int lstat(const char *path,struct stat *buf);

int fstat(int fd,struct stat *buf);

  • 成功时返回0;出错时返回EOF;
  • 如果path是符号链接stat获取的是目标文件的属性;而stat获取的是链接文件的属性。

静态库的使用

库的概念:

  • 库是一个二进制文件,包含的代码可以被程序调用
  • 标准C库、数学库、线程库.....
  • 库有源码,可以下载后编译;也可以直接安装二进制包
  • /lib  /usr/lib
  • 库是编译好的可以复用的代码
  • 使用库可以提高开发效率
  • Windows和Linux下库文件的格式不兼容
  • Linux下包含静态库和共享库

静态库特点:

  • 编译链接时把静态库中相关代码复制到可执行文件中
  • 程序中已经包含代码,运行时不再需要静态库
  • 程序运行时无需加载库,运行速度更快
  • 占用更多磁盘和内存空间
  • 静态库升级后,程序需要重新编译链接

静态库创建和使用过程:

  1. 确定库中函数的功能、接口
  2. 编写库源代码
  3. 编译生成目标文件$gcc  -c  hello.c  -Wall生成hello.o
  4. $ar -rsv  libhello.a hello.o
  5. $gcc -o test test.c -L. -lhello

ar参数:

        c:禁止在创建库时产生的正常信息

        r:如果指定的文件已经存在于库中,则代替它

        s:无论ar命令是否修改了库内容都强制重新生成库符号表

        v:将建立新库的详细的逐个文件的描述写至标准输出

        q:将指定的文件添加到库的末尾

        t;将库的目标写至标准输出

注意:

        1.静态库名字要以lib开头,后缀名为.a

        2.没有main函数的.c文件不能生成可执行文件

动态库(共享库)

共享库特点:

  • 编译链接时仅记录用到哪一个共享库中的哪一个符号,不复制共享库中相关代码
  • 程序不包含库中代码,尺寸小
  • 多个程序可以共享同一个库
  • 程序运行时需要加载库
  • 库升级方便,不需要重新编译程序
  • 使用更广泛

共享库的创建与使用过程:

1.确定库中函数的功能、接口

2.编写库源代码

3.编译生成目标文件$gcc -c -fPIC xx.c xxx.c ....-Wall生成xx.oxxx.o....

4.gcc -shared -o libxxxxx.so xx.o xxx.o ....

5.gcc -o test test.c -L. -lxxxxx

-fPIC:生成与位置无关的代码

让系统能找到要加载的共享库,有三种方法:

        1.把库文件拷贝到/usr/lib和/lib目录下

        2.在LD_LIBRARY_PATH环境变量中添加库所在路径

                export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库目录

                或者添加在~/.bashrc文件里面,$source ~/.bashrc生效

        3.添加/etc/ld.so.conf.d/libxxx.conf文件,执行ldconfig刷新

ldd:

$ldd 可执行文件名称

可以查看可执行文件使用的动态库

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值