IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 【Linux】应用篇五--目录与库 -> 正文阅读

[系统运维]【Linux】应用篇五--目录与库



一、目录操作与文件属性

1、读取目录

>opendir

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

#include  <dirent.h>
DIR  *opendir(const char *name);
DIR  *fdopendir(int fd); 

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

  • fdopendir使用文件描述符,要配合open函数使用
  • DIR是用来描述一个打开的目录文件结构体类型

>readdir

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

#include  <dirent.h>
 struct  dirent *readdir(DIR *dirp);

成功时返回目录流dirp下一个目录项;出错到末尾时时返回NULL

  • struct dirent是用来描述目录流一个目录项结构体类型
    包含成员char d_name[256] 见参考帮助文档

>closedir

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

#include  <dirent.h>
 int closedir(DIR *dirp);

成功时返回0出错时返回EOF(-1)


操作示例:
打印指定的目录下所有文件名称

int  main(int argc, char *argv[]) 
{
{
    DIR *dirp;
    struct dirent *dp;
    if (argc < 2) 
    {
       printf(“Usage : %s <directory>\n”, argv[0]);  
       return -1;
    }
    if ((dirp  = opendir(argv[1])) == NULL) 
    {
           perror(“opendir”);  
           return -1;
    }
    while ((dp = readdir(dirp)) != NULL) 
    {
        printf(%s\n”, dp->d_name);
    }
    closedir(dirp);

2、修改文件访问权限

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

#include  <sys/stat.h>
 int  chmod(const char *path, mode_t mode);
 int  fchmod(int fd, mode_t mode);

成功时返回0出错时返回EOF(-1)

  • root文件所有者能修改文件的访问权限
    示例: chmod(“test.txt”, 0666);

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


3、获取文件属性

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(-1)

如果path文件位置,stat获取的是目标文件的属性;而lstat获取的是链接文件的属性.

struct stat是存放文件属性的结构体类型:
重点关注的:

mode_t  st_mode;  //类型和访问权限
uid_t  st_uid;    //所有者id
uid_t  st_gid;    //用户组id
off_t  st_size;   //文件大小
time_t  st_mtime; //最后修改时间

所有成员:

struct stat 
{
	dev_t         st_dev;    //文件的设备编号
    ino_t         st_ino;    //节点
    mode_t        st_mode;   //文件的类型和存取的权限
    nlink_t       st_nlink;  //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;    //用户ID
    gid_t         st_gid;    //组ID
    dev_t         st_rdev;   //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;   //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
};

文件访问权限 – st_mode

通过系统提供的宏来判断文件类型:

S_IFMT                 0170000     文件类型的位遮罩
S_ISREG(st_mode)        0100000    是否常规文件
S_ISDIR(st_mode)        0040000    是否目录
S_ISCHR(st_mode)        0020000    是否字符设备
S_ISBLK(st_mode)        0060000    是否块设备
S_ISFIFO(st_mode)       0010000    是否FIFO文件
S_ISLNK(st_mode)        0120000    是否链接文件
S_ISSOCK(st_mode)       0140000    是否SOCKET文件
//示例:
if(S_ISREG(buf.st_mode))  //是否为该类型,
{
	//是该文件类型会怎么样
}

通过系统提供的宏来获取文件访问权限:

S_IRUSR         00400        bit:8    所有者有读权限
S_IWUSR         00200            7    所有者拥有写权限
S_IXUSR         00100            6    所有者拥有执行权限								  						 	
S_IRGRP         00040            5   群组拥有读权限
S_IWGRP         00020            4   群组拥有写权限
S_IXGRP         00010            3   群组拥有执行权限
S_IROTH         00004            2   其他用户拥有读权限
S_IWOTH         00002            1   其他用户拥有写权限
S_IXOTH         00001            0   其他用户拥有执行权限
//示例
for(i = 8;i >= 0; i--)
{
       if(buf.st_mode & (1<<i))
       {
          switch(i%3)
          {
          	case 2:   //8、5、2-r
              	printf("r");
              	break;
          	case 1:
              	printf("w"); 741-w
              	break;
          	case 0:
              	printf("x");630-x
              	break;
          }
       }
       else
       {
           printf("-");
       }
   }

二、库

1、静态库

1.编写库文件代码,编译为.o 目标文件。
2.ar 命令 创建 libxxxx.a 文件

ar -rsv libxxxx.a xxxx.o

注意:

  • 静态库名字要以lib开头,后缀名为.a
  • 没有main函数.c 文件不能生成可执行文件

3.链接静态库:

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

  • -L 表示库所在的路径
  • -l 后面跟库的名称

ar 的参数:

  • c :禁止在创建库时产生的正常消息
  • r :如果指定的文件已经存在于库中,则替换
  • s :无论 ar 命令是否修改了库内容都强制重新生成库符号表
  • v :将建立新库的详细的逐个文件的描述写至标准输出
  • q :将指定的文件添加到库的末尾
  • t :将库的目录写至标准输出

查看库中符号信息

$nm libhello.a

  hello.o:
  0000000 T  hello
                 U  puts
  • nm: 显示指定文件中的符号信息
  • -a :显示所有符号

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
含义:可执行文件所使用的动态库找不到
解决办法:
①找到动态库,添加到/usr/lib里面
②使用export  LD_LIBRARY_PATH=文件路径:
③动态库目录
添加在~/.bashrc 文件里面
使用source ~/.bashrc 生效。

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

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)

到这里就结束啦!
在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 21:01:04  更:2022-03-22 21:01:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:39:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码