LInux系统编程(3)

news2024/9/9 0:30:27

取得拓展属性

#include <sys/types.h>
#include <attr/xattr.h>

ssize_t getxattr(const char* path, const char* key, void* value, size_t size);
ssize_t lgetxattr(const char* path, const char* key, void* value, size_t size);
ssize_t fgetxattr(int fd, const char* key, void* value, size_t size);

执行成功时,getxattr()会从文件path将拓展属性key的值存入value缓冲区,缓冲区的长度为size个字节,并且返回此值的真实大小。

如果size为0,则不会存入value中,只返回值的大小,让应用程序决定缓冲区的大小,方便进行存储。

lgetxattr()的行为如同getxattr(),但是当path是一个符合链接时,返回链接本身的(而非连接的目标文件)的拓展属性。

设定一个拓展属性

#include <sys/types.h>
#include <attr/xattr.h>

int setxattr(const char* path, const char* key, const void* value, size_t size, int flags);
int lsetxattr(const char* path, cosnt char* key, const void* value, size_t size, int flags);
int fsetxattr(int fd, const char* key, const void* value, size_t size, int flags);

列出文件上的拓展属性

#include <sys/types.h>
#include <attr/xattr.h>

ssize_t listxattr(const char* path, char* list, size_t size);
ssize_t llistxattr(const char* path, char* list, size_t size);
ssize_t flistxattr(int fd, char*list, size_t size);

执行成功时,listxattr()返回path文件的拓展属性列表,存入list中,函数返回列表的实际大小,以字节为单位。

每个拓展属性被传入到list并且以NULL字符结尾,如下所示:

“user.md5_sum\0user.mime_type\0system.posix_acl_default\0”

如果调用时size设置为0,函数返回列表的实际长度。

llistxattr()的行为如同listxattr(),当path是一个符号连接时,返回的是链接本身(而不是链接的目标文件)有关的拓展属性。

移除一个拓展属性

#include <sys/types.h>
#include <attr/xattr.h>

int removexattr(const char* path, const char* key);
int lremovexattr(const char* path, const char* key);
int fremovexattr(int fd, const char* key);

获取当前目录

#include <unistd.h>
#include <stdio.h>

int main() {
    char *cwd;
    cwd = getcwd(NULL, 0);
    if(cwd) {
        printf("%s", cwd);
    }
    return 0;
}

LInux的C链接库还提供了一个get_current_dir_name()函数,当buf为NULL而且size=0时,函数如同getcwd()函数

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main() {
    char *cwd;
    cwd = get_current_dir_name();
    if(cwd) {
        printf("%s", cwd);
    }
    free(cwd);
    return 0;
}

变更当前工作目录

#include <unistd.h>

int chdir(const char* path);
int fchdir(int fd);

chdir()可用于将当前工作目录变更为path所指定的路径名称,可以绝对路径也可以相对路径,fchdir()用于将当前工作目录变更为fd(必须对应到已经打开的目录)所代表的路径名称。

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main() {
    int swd_fd;
    swd_fd = open(".", O_RDONLY);
    if (swd_fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    // 变更为不同的目录
    ret = chdir(some_other_dir);
    if (ret) {
        perror("chdir");
        exit(EXIT_FAILURE);
    }
    // 在新目录中进行其他操作
    // 返回所保存的目录中
    ret = fchdir(swd_fd);
    if (ret) {
        perror("fchdir");
        exit(EXIT_FAILURE);
    }
    // 关闭所在目录
    ret = close(swd_fd);
    if (ret) {
        perror("close");
        exit(EXIT_FAILURE);
    }
    return 0;
}

 创建目录

#include <sys/types.h>
#include <sys/stat.h>

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

 执行成功时,会创建权限为mode(经过umask修改)的目录path。

移除目录

#include <unistd.h>

int rmdir(const char* path);

path路径必须是空的,只能包含‘.’和'..‘路径,没有实现rm -r 的递归删除功能,须手动深度搜索,从叶节点开始删除。

 读取一个目录内容

#include <sys/types.h>
#include <dirent.h>

DIR* opendir(const char* name);

执行成功时,会创建一个目录流,表示name所指定的目录。目录流就是一个信息比较多的文件描述符,代表已经打开的目录,因此可以获取特定目录流后面的文件描述符:

#define _BSD_SOURCE
#include <sys/types.h>
#include <dirent.h>

int dirfd(DIR* dir);

执行成功时,返回dir目录流的文件描述符。

 从目录流中读取数据

#include <sys/types.h>
#include <dirent.h>

struct dirent* readdir(DIR* dir);

 

关闭目录流

#include <sys/types.h>
#include <dirent.h>

int closedir(DIR* dir);
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>

/**
 * find_file_int_dir  从目录path中搜索file的文件
 * 存在返回0,否则返回非0
*/
int find_file_in_dir(const char* path, const char* file) {
    struct dirent* entry;
    int ret = 1;
    DIR* dir;
    dir = opendir(path);
    errno = 0;  //这句很重要
    while((entry = readdir(dir)) != NULL) {
        if (!strcmp(entry->d_name, file)) {
            ret = 0;
            break;
        }
    }
    if (errno && !entry) {
        perror("readdir");
    }
    closedir(dir);
    return ret;
}

int main() {
    printf("%d\n", find_file_in_dir(".", "test.c"));
    printf("%d\n", find_file_in_dir(".", "aaaa"));
    return 0;
}

硬链接

#include <unistd.h>

int link(const char* oldpath, const char* newpath);

调用成功之后,oldpath和newpath会指向同一个文件,无法区分谁是最初的链接。

符号链接

#include <unistd.h>
int symlink(const char* oldpath, const char* newpath);

 解除链接

#include <unistd.h>
int unlink(const char* pathname);

#include <stdio.h>
int remove(const char* path);

执行成功时,remove会从文件系统中删除path并且返回0,如果path是一个文件,调用unlink,如果path是一个目录,则调用rmdir()

移动

#include <stdio.h>
int rename(const char* oldpath, const char* newpath);
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#include <sys/stat.h>



int main(int argc, char** argv) {
    int fd, ret;
    if (argc < 2) {
        fprintf(stderr, "usage: %s < device to eject>\n", argv[0]);
        return 1;
    }
    /**
     * 以只读方式打开CD-ROM设备,O_NONBLOCK用于通知内核,即使
     * 设备中没有媒体,也要打开设备
    */
    fd = open(argv[1], O_RDONLY | O_NONBLOCK);
    if (fd < 0) {
        perror("open");
        return 1;
    }
    /**
     * 给CD-ROM设备送出弹出命令
    */
    ret = ioctl(fd, CDROMEJECT, 0);
    if (ret) {
        perror("ioctl");
        return 1;
    }
    ret = close(fd);
    if (ret) {
        perror("close");
        return 1;
    }
    return 0;
}

初始化inotify

#include <inotify.h>
int inotify_init(void);

加入一个新的监视项目

#include <inotify.h>
int inotify_add_watch(int fd, const char* path, uint32_t mask);

为path文件或者目录添加一个mask所描述的监听项目至fd所表示的inotify实例。

int wd;
wd = inotify_add_watch(fd, "/etc", IN_ACCESS | IN_MODIFY);
if (wd == -1) {
    perror("inotify_add_watch");
    exit(EXIT_FAILLURE);
}

 此范例会在/etc所在目录上的所有读取和写入加上一个监视项目,如果/etc中任何文件被读取或者写入,inotify会传送一个事件给inotify文件描述符fd,提供给监视描述符wd。

inotify事件

 

读取inotify事件

char buf[BUF_LEN]__attribute__((aligned(4)));
ssize_t len, i = 0;

// 读取BUF_LEN个字节的事件
len = read(fd, buf, BUF_LEN);

// 读取每个事件直到读完为止
while(i < len) {
    struct inotify_event * event = (struct inotify_event*) &buf[i];
    printf("wd=%d mask=%d cookie=%d len=%d dir=%s\n", event->wd,
    event->mask, event->cookie,event->len, (event->mask & IN_ISDIR)?"yes":"no");
    
    //如果有一个名称,则输出它
    if(event->len)
        printf("name=%d\n", event->name);
    
    //将索引更新为下一个事件的开头
    i += sizeof(struct inotify_event) + event->len;
}

 因为inotify文件描述符的行为如同一个常规文件,可以使用select,poll,epoll监听。

    int wd;
    /**
     * 只有在/etc/init.d 是一个目录,且他的路径中没有一个部分是符号链接时,
     * 才会监视/etc/init.d是否被移动过
    */
    wd = inotify_add_watch(fd, "/etc/init.d", IN_MOVE_SELF | IN_ONLYDIR | IN_DONT_FOLLOW);
    if (wd == -1) {
        perror("inotify_add_watch");
    }

 移除一个inotify监视项目

#include <inotify.h>
int inotify_rm_watch(int fd, uint32_t wd);

取得事件队列的大小

#include <sys/ioctl.h>

unsigned int queue_len;
int ret;
ret = ioctl(fd, FIONREAD, &queue_len);
if (ret < 0)
    perror("ioctl");
else
    printf("%u bytes pending in queue\n", queue_len);

销毁一个inotify实例

int ret;
// fd 经 inotify_init() 取得
ret = close(fd);
if (fd == -1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS 任务的创建与删除

目录 1. 什么是任务&#xff1f; 2. 任务创建与删除相关函数 任务创建与删除相关函数有如下三个&#xff1a; 任务动态创建与静态创建的区别&#xff1a; xTaskCreate 函数原型​编辑 vTaskDelete 函数原型 3. 创建两个任务进行点灯实操 使用CubeMX快速移植 1.增加两个…

【谢希尔 计算机网络】第4章 网络层

目录 网络层 网络层的几个重要概念 网络层提供的两种服务 网络层的两个层面 网际协议 IP 虚拟互连网络 IP 地址 IP 地址与 MAC 地址 地址解析协议 ARP IP 数据报的格式 IP 层转发分组的过程 基于终点的转发 最长前缀匹配 使用二叉线索查找转发 网际控制报文协议…

2023CSPS 种树 —— 二分+前缀和

This way 题意&#xff1a; 一开始以为是水题&#xff0c;敲了一个二分贪心检查的代码&#xff0c;20分。发现从根往某个节点x走的时候&#xff0c;一路走来的子树上的节点到已栽树的节点的距离会变短&#xff0c;那么并不能按照初始情况贪心。 于是就想着检查时候用线段树…

2023-1024‍节日(内含表白代码)

文章目录 一、前言二、代码实现三、动态展示四、总结 一、前言 1024可以是计算机操作系统的进制单位&#xff0c;也可以是&#x1f9d1;‍&#x1f4bb;程序员们的特殊纪念日。 每年10月24日被行业认定为“程序员节”。 今天&#xff0c;正是一年一度的“1024程序员节”在此纪…

LeetCode讲解篇之面试题 01.08. 零矩阵

文章目录 题目描述题解思路题解代码 题目描述 题解思路 遍历矩阵&#xff0c;若当前元素为零&#xff0c;则将该行和该列的第一个元素置零 遍历第一行&#xff0c;若当前元素为零&#xff0c;则将当前列置零 遍历第一列&#xff0c;若当前元素为零&#xff0c;则将当前行置零 …

Kong:高性能、插件化的云原生 API 网关 | 开源日报 No.62

Kong/kong Stars: 35.2k License: Apache-2.0 Kong 是一款云原生、平台无关且可扩展的 API 网关。它以高性能和插件化的方式脱颖而出&#xff0c;提供了代理、路由、负载均衡、健康检查和认证等功能&#xff0c;并成为编排微服务或传统 API 流量的中心层。 以下是 Kong 的核心…

浏览器面试题及答案【集合目录】

前言&#xff1a; 欢迎浏览和关注本专栏《 前端就业宝典 》&#xff0c; 不管是扭螺丝还是造火箭&#xff0c; 多学点知识总没错。 这个专栏是扭螺丝之上要造火箭级别的知识&#xff0c;会给前端工作学习的小伙伴带来意想不到的帮助。 本专栏将前端知识拆整为零&#xff0c;主要…

kr第三阶段(二)32 位汇编

编译与链接 环境配置 masm32 masm32 是微软的 masm32 的民间工具集合。该工具集合除了 asm32 本身的汇编器 ml 外还提供了&#xff1a; SDK 对应的函数声明头文件和 lib 库。32 位版本的 link&#xff08;原版本是 16 位&#xff0c;这里的 32 位版本的 link 来自 VC 6.0&a…

IDEA工具第二篇:自定义Java方法注释模板 | 京东云技术团队

网上搜索类似的文章有很多&#xff0c;但是一味的复制粘贴总会出现各种奇葩问题&#xff0c;最后然并卵&#xff01;今天特意自己研究琢磨一下&#xff0c;将最终结果分享给大家&#xff0c;100%亲测可用。 一、说明 想必大家都用过Eclipse的方法注释生成&#xff0c;方法上输…

Django结合Celery进行异步调用

目录 Celery介绍 相关环境 相关配置 1、在proj/proj/目录下创建一个新的celery.py模块 定义 Celery 实例&#xff1a; 2、在proj/proj/__init__.py 模块中导入这个应用程序。 3、在各自模块中定义任务文件tasks.py 4、settings.py配置 服务启动 异步调用 Celery介绍 C…

ChatGPT AIGC 办公自动化拆分Excel工作表

在职场办公中对数据的操作,经常需要将一份表格数据拆分成多个表。 但是在Excel中进行表格拆分的步骤比较多。 在Excel中拆分工作表的步骤: 1.打开您的Excel工作簿,选择您要拆分的工作表。 2.右键单击工作表标签(通常在底部),选择“移动或复制”。 3.在“移动或复制”…

SpringCloud和Kubernetes的区别

又见小道仙&#xff1a; https://blog.csdn.net/Tomwildboar/article/details/129531315 对于SpringCloud在实际项目中并未使用过&#xff0c;只是自学过SpringCloud和SpringCloud Alibaba&#xff0c;也基于学习搭建过demo。 对于Kubernetes&#xff0c;目前这家公司就是使用…

SpringBoot引入包报红,无法使用Maven依赖

今天又是一年一度的程序员节&#xff0c;希望各位编码的小伙伴们能够健健康康&#xff0c;开开心心。 最近弄了一个SpringBoot项目&#xff0c;今天拉取代码的时候发现文件都变成了这样子 平时常用的依赖包都用不了了&#xff0c;重新加载&#xff0c;重新install都无效&#…

浏览器标签上添加icon图标;html引用ico文件

实例 <link rel"shortcut icon" href"./XXX.ico" type"image/x-icon">页面和图标在同一目录内 则 <link rel"shortcut icon" type"text/css" href"study.ico"/>可以阿里矢量图库关键字搜索下载自己…

【tg】9 : InstanceImpl 、 虚拟的音频渲染设备FakeAudioDeviceModuleImpl

代码分布 WebRTC-Manager 线程:manager线程 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\InstanceImpl.h Manager 使用的是 WebRTC-Manager 线程 InstanceImpl 对Manager 的封装和调用 #

【ESP-BOX-LITE】:照片查看器

目录 项目场景&#xff1a; 项目需求描述&#xff1a; 项目技术&#xff1a; 项目成果&#xff1a; 项目总结&#xff1a; 项目视频&#xff1a; 芳香 项目场景&#xff1a; 使用ESP-BOX-LITE实现照片查看器功能&#xff0c;显示多级目录下的图片或文件夹&#xff0c;自…

Mac风扇控制电脑降温软件Macs Fan Control Pro 简体中文

Macs Fan Control Pro是一款功能强大的Mac风扇控制软件&#xff0c;旨在帮助用户更好地管理和控制Mac电脑的风扇速度和温度传感器。以下是该软件的主要特色介绍&#xff1a; 监测和调整Mac电脑的风扇速度和温度传感器&#xff0c;帮助用户控制设备温度&#xff0c;提高电脑性能…

浅谈RabbitMQ的延迟队列

Part 01、 延迟队列是什么 延迟队列代表了一种强大的消息传递机制&#xff0c;允许我们在将消息发送至RabbitMQ时&#xff0c;规定它们只能在未来某个预定的时间点被消费。这种特殊类型的消息被简称为"延迟消息"。 以RabbitMQ为例&#xff0c;它允许我们通过延迟…

【LeetCode:637. 二叉树的层平均值 | bfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

用nodejs爬虫台湾痞客邦相册

情景:是这样的,我想保存一些喜欢的小伙伴的照片,一张张保存太慢了, 所以我写了个js,放在国外服务器爬,国内的自己解决~ 使用方法 1.点相册随便一张, 复制url, 这张开始接下来的图片都会保存 /*** 2023年10月23日 22:58:44* 支持解析痞客邦相册* 只需要复制相册第一张图片的ur…