• Linux学习——目录操作和库使用


    目录

    一、打开目录

    二、读取目录

    三、关闭目录

    四、修改文件权限

    五、获取文件属性

    六、库的概念:

    1、静态库

    缺点:

    优点:

    创建静态库步骤:

    链接静态库:

     2、动态库

    动态库的生成步骤:

    练习题:


    一、打开目录

    #include 

     DIR  *opendir(const char *name);

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

    DIR是用来描述一个打开的目录文件的结构体类型

    成功时返回目录流指针;出错时返回NULL

    二、读取目录

    #include 

     struct  dirent *readdir(DIR *dirp);

    struct dirent是用来描述目录流中一个目录项的结构体类型

    包含成员char  d_name[256]   参考帮助文档

    成功时返回目录流dirp中下一个目录项;

    出错或到末尾时时返回NULL

    三、关闭目录

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

     #include 

     int closedir(DIR *dirp);

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

    实验程序:

    1. #include
    2. #include
    3. int main(int argc,char **argv){
    4. DIR* dp;
    5. struct dirent *dt;
    6. dp=opendir("/home/book/Desktop/Lv4/Day5");
    7. if(dp<0){
    8. perror("opendir");
    9. return 0;
    10. }
    11. while((dt=readdir(dp))!=NULL){
    12. printf("%s\n",dt->d_name);
    13. }
    14. closedir(dp);
    15. }

    实验结果:

     

    四、修改文件权限

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

     #include 

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

     int  fchmod(int fd, mode_t mode);

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

    注意:在vmwarewindows共享的文件夹下,有些权限不能改变。

    五、获取文件属性

    #include 

     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获取的是目标文件的属性;而lstat获取的是链接文件的属性

     

     

     

    实验程序:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main (int argc,char **argv){
    7. struct stat buf;
    8. int ret;
    9. ret = stat("chmod_t.c",&buf);
    10. if(ret<0){
    11. perror("stat");
    12. return 0;
    13. }
    14. if(S_ISREG(buf.st_mode)){
    15. printf("-");
    16. }
    17. if(S_ISDIR(buf.st_mode)){
    18. printf("d");
    19. }
    20. if(S_ISCHR(buf.st_mode)){
    21. printf("c");
    22. }
    23. if(S_ISBLK(buf.st_mode)){
    24. printf("b");
    25. }
    26. if(S_ISFIFO(buf.st_mode)){
    27. printf("p");
    28. }
    29. if(S_ISSOCK(buf.st_mode)){
    30. printf("s");
    31. }
    32. // printf(" ");
    33. int i;
    34. for(i=8;i>=0;i--){
    35. if(buf.st_mode & (1<
    36. switch(i%3){
    37. case 2:
    38. printf("r");
    39. break;
    40. case 1:
    41. printf("w");
    42. break;
    43. case 0:
    44. printf("x");
    45. break;
    46. }
    47. }else{
    48. printf("-");
    49. }
    50. }
    51. printf(" %d",(int)buf.st_size);
    52. struct tm *t;
    53. t = localtime(&buf.st_ctime);
    54. printf(" %d-%d-%d %d:%d",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);
    55. printf(" chmod_t.c\n");
    56. }

    实验结果:

     

    六、库的概念:

    区别:

    1、静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。

    2、静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行;动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。

    从产品化的角度,发布的算法库或功能库尽量使动态库,这样方便更新和升级,不必重新编译整个可执行文件,只需新版本动态库替换掉旧动态库即可。

    从函数库集成的角度,若要将发布的所有子库(不止一个)集成为一个动态库向外提供接口,那么就需要将所有子库编译为静态库,这样所有子库就可以全部编译进目标动态库中,由最终的一个集成库向外提供功能。

    1、静态库

    缺点:

    浪费磁盘空间,1000个文件调用就要拷贝1000份。

    升级后需要重新编译链接。

    优点:

    编译(链接)时把静态库中相关代码复制到可执行文件中

    程序中已经包含代码,运行时不再需要静态库,运行速度更快

    创建静态库步骤:

    1 . 编写库文件代码,编译为.o 目标文件。

    2.ar 命令 创建  libxxxx.a 文件

       ar -rsv  libxxxx.a  xxxx.o

       注意:

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

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

    链接静态库:

    gcc -o 目标文件 源码.c  -L路径  -lxxxx

    -L  表示库所在的路径

    -l 后面跟库的名称

    程序:

    test.c

    1. #include
    2. void hello();
    3. void bye();
    4. int main(int argc,char **argv){
    5. hello();
    6. //bye();
    7. return 0;
    8. }

    hello.c

    1. #include
    2. void bye(){
    3. printf("bye\n");
    4. }

    结果:

     2、动态库

    动态库的生成步骤:

    1、生成位置无关代码的目标文件

     gcc  -c  -fPIC  xxx.c xxxx.c ....

    2、生成动态库

     gcc  -shared -o libxxxx.so  xxx.o  xxx.o ....

    3、编译可执行文件

    gcc -o 目标文件 源码.c  -L路径  -lxxxx

    执行动态库的可执行文件错误

    ./test: error while loading shared libraries: libmyheby.so: cannot open shared object file: No such file or directory

    含义:可执行文件所使用的动态库找不到

    解决办法:

    因为动态库会先在系统的lib里找所以找到动态库,添加到/usr/lib里面

    //不提倡因为会把自己的lib库搞乱

    或者使用export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库目录

    添加在~/.bashrc 文件里面

    使用source ~/.bashrc 生效。

    实验程序:

    bye.c

    1. #include
    2. void bye(){
    3. printf("bye\n");
    4. }

    实验结果:

     换一个终端会再次失效

    加入到系统环境变量里才能一直生效。

     

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

    ldd 命令 :   ldd 你的可执行文件

    root@haas-virtual-machine:/mnt/hgfs/share/newIOP# ldd test

            linux-vdso.so.1 =>  (0x00007fff6548d000)

            libmyheby.so => /mnt/hgfs/share/newIOP/day5/libmyheby.so (0x00007f5c89521000)

            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c89144000)

            /lib64/ld-linux-x86-64.so.2 (0x000055fe52211000)

    root@haas-virtual-machine:/mnt/hgfs/share/newIOP/day5# ldd test

            linux-vdso.so.1 =>  (0x00007ffcb652c000)

            libmyheby.so => not found

            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbeeffaf000)

            /lib64/ld-linux-x86-64.so.2 (0x0000561003c3b000)

    练习题:

    遍历一个文件夹下所有文件,并打印文件大小和日期

    程序:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. int main(int argc,char **argv){
    9. DIR* dp;
    10. struct dirent *dt;
    11. struct stat buf;
    12. char buf1[64];
    13. char buf2[15];
    14. //memset(buf2,' ',15);
    15. int ret;
    16. struct tm *t;
    17. dp=opendir("/home/book/Desktop/Lv4/Day5");
    18. if(dp<0){
    19. perror("opendir");
    20. return 0;
    21. }
    22. while((dt=readdir(dp))!=NULL){
    23. //printf("%s ",dt->d_name);
    24. ret = stat(dt->d_name,&buf);
    25. strcpy(buf2,dt->d_name);
    26. if(ret<0){
    27. perror("stat");
    28. return 0;
    29. }
    30. //printf(" %d",(int)buf.st_size);
    31. t = localtime(&buf.st_ctime);
    32. //printf(" %d-%d-%d %d:%d",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);
    33. sprintf(buf1,"name:%15s size:%5d B time: %d-%d-%d %d:%d\n",buf2,(int)buf.st_size,t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);
    34. printf("%s",buf1);
    35. }
    36. closedir(dp);
    37. }

    结果:

     

  • 相关阅读:
    巧用 tabindex 属性解决 iframe 环境下鼠标点击元素之外的监听事件
    Win11透明任务栏失效怎么办
    【MySQL数据库和JDBC编程】第四章:MySQL索引和事务
    Mysql事务日志
    Mongoose基本操作
    软考高级系统架构设计师系列之:案例分析典型试题四
    【Android笔记21】Android中的导航栏ActionBar的介绍及使用
    基于JAVA人事管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
    no such file or directory, lstat ‘C:\Users\lanzuo\AppData\Roaming\npm‘
    [锁]:乐观锁与悲观锁
  • 原文地址:https://blog.csdn.net/qq_52479948/article/details/127702540