目录操作(opendir,stat)、静态库、动态库

一、目录操作函数

opendir
函数原型:
	DIR *opendir(const char *name);
函数参数:
	name:目录名
返回值:返回一个指向该目录操作的流指针
readdir
函数原型:
	struct dirent *readdir(DIR *dirp);
函数参数:
	dirp:目录流指针
返回值:返回结构体指针,读取完毕返回NULL
	struct dirent 
	{
		ino_t          d_ino;       /* 索引节点号 */
		off_t          d_off;       /* 在目录文件中的偏移 */
		unsigned short d_reclen;    /* 文件名长度 */
		unsigned char  d_type;      /* 文件类型 */
		char           d_name[256]; /* 文件名 */
	};
closedir
int closedir(DIR *dirp);

打开当前目录下的所有文件:
在这里插入图片描述
通过opendir代开一个目录的绝对路径,随后readdir函数不断获取下一个目录项,如果返回的结构体类型指针为NULL时说明已经读取完目录中的所有相然后输出

stat
函数原型:
	int stat(const char *pathname, struct stat *statbuf);
函数参数:
	pathnam:文件路径
	statbuf:文件属性结构体
返回值:成功返回0,失败返回-1
	struct stat 
    {
		dev_t     st_dev;         /* 文件所在设备的ID */
		ino_t     st_ino;         /* Inode编号 */
         mode_t    st_mode;        /* 文件模式 */
         nlink_t   st_nlink;       /* 链接数 */
         uid_t     st_uid;         /* 用户ID */
         gid_t     st_gid;         /* 组ID */
         dev_t     st_rdev;        /* 设备号 */
         off_t     st_size;        /* 文件大小 */
         blksize_t st_blksize;     /* 文件存储的块大小 */
         blkcnt_t  st_blocks;      /* 文件所占块数*/
         struct timespec st_atim;  /* 最后访问的时间 */
         struct timespec st_mtim;  /* 最后修改的时间 */
         struct timespec st_ctim;  /* 最后改变状态的时间 */
		#define st_atime st_atim.tv_sec  
         #define st_mtime st_mtim.tv_sec
         #define st_ctime st_ctim.tv_sec
	};

getpwuid

getgrgid

利用目录函数实现ls-l的效果
默认为当前目录并打开它,返回一个目录流指针赋值给dp
在这里插入图片描述
man 7 inode查找宏函数
在这里插入图片描述
查看当前文件下的字目录的权限需要写9个
在这里插入图片描述

在这里插入图片描述

二、静态库

优点:程序在运行时与函数库再无瓜葛,移植方便

缺点:浪费空间和资源,因为所有相关的对象文件与牵涉到的函数库被链接合成一个可执行文件

制作静态库

1.将.c文件编译成.o文件 gcc -c *.c

2.将.o文件做成静态库 ar crs lib库名.a *.o

使用静态库

gcc main.c -L库路径 -l库名
在这里插入图片描述
在这里插入图片描述
先分别定义两个.c .h文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

制作动态库

1.将.c文件编译成.o文件 gcc -fPIC -Wall -c *.c

2.将.o文件做成动态库 gcc -shared -o libmyfunc.so *.o

使用动态库

1.编译源码 gcc main.c -L. -lmyfunc

2.运行程序前将库放在能找到的路径下

​ (1) 把库拷贝到/usr/lib和/lib目录下。

(2) 在LD_LIBRARY_PATH环境变量中加上库所在路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hqyj/share_lib

​ (3) 添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径加到文件末尾,并执行ldconfig 刷新, 这样,加入的目录下的所有库文件都可见。

-fPIC 创建与地址无关的编译程序

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值