当前位置: 首页 > news >正文

qq刷赞网站如何做分站搜索推广账户结构

qq刷赞网站如何做分站,搜索推广账户结构,单页网站建设一般收费,泉港网站建设推广服务公司1 Fanotify vs Inotify 在实现某些功能时#xff0c;可能需要获取某个文件执行的操作#xff0c;一种可能的方案是用Audit的路径监控#xff0c;但是Audit存在性能和内核稳定性问题#xff0c;这个时候就可以其他的文件变更检测机制。 inotify可以监控文件被创建、修改和…1 Fanotify vs Inotify 在实现某些功能时可能需要获取某个文件执行的操作一种可能的方案是用Audit的路径监控但是Audit存在性能和内核稳定性问题这个时候就可以其他的文件变更检测机制。 inotify可以监控文件被创建、修改和访问的事件当文件或者目录发生变化时可以得到变更的事件但是inotify有个比较大的不足就是无法得到执行操作的进程Pid。fanotify是另一种文件监控机制在使用上两者类似都是先调用init函数初始化句柄然后调用类似watch的函数添加监控路径再使用selectread的方式读取出变化的事件根据事件中给出的参数获取文件的路径、事件类型以及其他需要的数据。与inotify相比fanotify的优势在于 访问控制inotify只能监控文件的变化而fanotify可以在用户操作之前决定是否可以继续操作相当于可以用于实现阻断的功能监控范围inotify用于监控文件或者目录的变化如果要监控目录下所有文件(包括子目录)就需要自行递归添加路径fanotify则提供directed、per-mount和global三种监控模式其中global模式可以用于监控整个文件系统进程信息inotify只能得到某个文件发生了什么事件fanotify可以得到对文件操作的进程pid程序可以从/proc/pid读取进程信息 2 Fanotify Demo #include sys/fanotify.h #include fcntl.h #include stdio.h #include unistd.h #include errno.h #include stdlib.h #include string #include string.hint main(int argc, char *argv[]) {int fan_fd, fd;if(argc 2) {printf(usage: ./main path\n);return -1;}// 初始化fanotify的描述符后续的操作都是通过该描述符fan_fd fanotify_init(FAN_CLASS_NOTIF, O_RDONLY);if (fan_fd 0) {perror(fanotify_init);return -1;}// 增加监控路径if (fanotify_mark(fan_fd, FAN_MARK_ADD, FAN_ACCESS|FAN_MODIFY|FAN_EVENT_ON_CHILD, AT_FDCWD, argv[1]) 0) {perror(fanotify_mark);return -1;}fd_set rfds;while (1) {// 使用selectread读取变更的事件FD_ZERO(rfds);FD_SET(fan_fd, rfds);struct timeval timeo {.tv_sec 0, .tv_usec 500000};char buf[4096] {0};int ret select(fan_fd 1, rfds, NULL, NULL, timeo);if (ret 0) {close(fan_fd);fan_fd -1;break;} else if (ret 0) {continue;}struct fanotify_event_metadata* metadata reinterpret_caststruct fanotify_event_metadata*(buf);ssize_t len read(fan_fd, buf, sizeof(buf));if (len -1 errno EAGAIN) {continue;}if (len -1) {perror(read);exit(EXIT_FAILURE);}// 遍历返回的变更事件for (; FAN_EVENT_OK(metadata, len);metadata FAN_EVENT_NEXT(metadata, len)) {printf(fd%d pid%d , metadata-fd, metadata-pid);// 根据返回的事件中的mask判断事件类型if (metadata-mask FAN_ACCESS) {printf(eventread );} else if (metadata-mask FAN_MODIFY) {printf(eventwrite );} else {printf(eventother );}// 根据返回事件中的fd读取操作的文件路径char path[1024] {0};char flink[1024] {0};sprintf(flink, /proc/self/fd/%d, metadata-fd);if (readlink(flink, path, sizeof(path)) 0) {printf(readlink %s failed: %s\n, flink, strerror(errno));close(metadata-fd);printf(\n);continue;}printf(path%s\n, path);// 此处不能少由于该fd是在当前进程中需要在处理完该事件后关闭close(metadata-fd);}}close(fan_fd);return 0; }3 Fanotify API 通过上述示例代码发现使用fanotify监控路径的基本套路是 调用fanotify_init初始化文件描述符调用fanotify_mark对路径进行监控使用selectread读取变更事件使用FAN_EVENT_OK和FAN_EVENT_NEXT宏遍历变更事件读取到变更事件后根据事件中的mask得到事件类型通过事件中的pid得到进程信息通过事件中的fd得到文件路径处理完成后关闭fd关闭fanotify的文件描述符 因此使用过程中重点是需要了解fanotify_init和fanotify_mark两个API的参数和含义。 3.1 fanotify_init #include fcntl.h #include sys/fanotify.hint fanotify_init(unsigned int flags, unsigned int event_f_flags);fanotify_init函数用于初始化文件描述符flags参数可以使用两类标志一类是通知类型(notification classes)另一类是对fanotify的文件描述符的一些属性设置。 通知类型有三类 FAN_CLASS_PRE_CONTENT当文件被访问和文件内容被修改之前收到事件适用于在文件被修改之前需要执行操作的场景FAN_CLASS_CONTENT当文件被访问和文件内容被修改之后收到事件适用于在文件被修改之后需要执行操作的场景FAN_CLASS_NOTIF默认值当文件被访问时会收到事件不能进行访问控制 如果程序只需要获取事件而不需要进行访问控制可以用默认值否则就需要根据使用场景进行选择。另外根据含义三类事件也是按照从上到下的顺序接收的。 设置fanotify的文件描述符的属性的标志 FAN_CLOEXEC设置fanotify的文件描述符的close-on-exec属性类似open中的O_CLOEXECFAN_NONBLOCK将文件描述符设置为非阻塞FAN_UNLIMITED_QUEUE移除事件队列的长度限制默认限制是16384个事件该标志位需要CAP_SYS_ADMIN权限FAN_UNLIMITED_MARKS移除监控点数量的限制默认限制是8192该标志位需要CAP_SYS_ADMIN权限 除了上述标志位后续的内核还提供其他的标志位可以在事件上上报更多数据 FAN_REPORT_TIDkernel4.20事件包含线程IDFAN_REPORT_FIDkernel5.1事件文件系统信息通知类型必须是FAN_CLASS_NOTIFFAN_REPORT_DIR_FIDkernel5.9事件包含目录信息FAN_REPORT_NAMEkernel5.9事件包含目录名该标志必须和FAN_REPORT_DIR_FID一起使用FAN_REPORT_DFID_NAMEFAN_REPORT_DIR_FID|FAN_REPORT_NAME flags可以设置通知类型中的一种和属性设置中的若干标志。 event_f_flags用于设置收到的事件中的文件描述符的属性常用的标志位有 O_RDONLY只读O_LARGEFILE对超过2GB文件的支持O_CLOEXEC设置close-on-exec属性 当然也可以设置其他标志位O_WRONLY、O_RDWR、O_APPEND、O_DSYNC、O_NOATIME、O_NONBLOCK、O_SYNC。 3.2 fanotify_mark #include sys/fanotify.hint fanotify_mark(int fanotify_fd, unsigned int flags,uint64_t mask, int dirfd, const char *pathname);fanotify_mark函数用于操作监控路径可以增加监控路径也可以删除监控路径。 fanotify_mark有5个参数 fanotify_fdfanotify_init返回的fanotify的描述符flags对监控点的操作mask要监控的操作dirfd监控路径的fdpathname监控路径 flags是表明需要对监控点进行何种操作是增还是减 FAN_MARK_ADD增加监控点FAN_MARK_REMOVE移除监控点FAN_MARK_FLUSH删除所有监控点 flags可以从上述三个操作中选择一个然后再结合以下标志位设置 FAN_MARK_DONT_FOLLOW如果pathname是软链接只监控软链接本身而不是软链接指向的文件FAN_MARK_ONLYDIR只监控目录如果监控的不是目录则报错FAN_MARK_MOUNT监控pathname指定的挂载点路径如果pathname不是挂载点则监控pathname所在的挂载点挂载点的所有目录和文件都会监控 除了上述标志位kernel4.20还提供FAN_MARK_FILESYSTEM表示监控pathname所在的整个文件系统。 mask表明要监控的事件类型 FAN_ACCESS读文件或者目录FAN_MODIFY写文件FAN_CLOSE_WRITE写关闭FAN_CLOSE_NOWRITE读关闭FAN_OPEN打开文件或者目录FAN_OPEN_PERM在请求打开文件或者目录时创建fanotify文件描述符时需要使用FAN_CLASS_PRE_CONTENT或者FAN_CLASS_CONTENTFAN_ACCESS_PERM在请求读取文件或者目录时创建fanotify文件描述符时需要使用FAN_CLASS_PRE_CONTENT或者FAN_CLASS_CONTENTFAN_ONDIR目录操作的事件如果没有该标志位只有操作文件的事件FAN_EVENT_ON_CHILD为监控目录的一级路径添加事件FAN_CLOSEFAN_CLOSE_WRITE|FAN_CLOSE_NOWRITE关闭文件 以上是从内核版本2.6.37开始支持的事件类型也有更高版本支持的事件类型 FAN_OPEN_EXECkernel5.0执行可以执行文件FAN_ATTRIBkernel5.1属性变更FAN_CREATEkernel5.1在监控目录中创建文件或者目录FAN_DELETEkernel5.1在监控目录中删除文件或者目录FAN_DELETE_SELFkernel5.1删除监控路径FAN_MOVED_FROMkernel5.1从监控目录中移走FAN_MOVED_TOkernel5.1移入监控目录FAN_MOVE_SELFkernel5.1移动监控文件或者目录本身FAN_OPEN_EXEC_PERMkernel5.0在请求执行可执行文件时创建fanotify文件描述符时需要使用FAN_CLASS_PRE_CONTENT或者FAN_CLASS_CONTENTFAN_MOVEFAN_MOVED_FROM|FAN_MOVED_TO 监控路径则依赖dirfd和pathname两个参数 如果pathname为NULL则监控dirfd指定的文件系统如果pathname为NULLdirfd设置为AT_FDCWD则监控当前工作目录如果pathname为绝对路径则监控该路径此时忽略dirfd参数如果pathname为相对路径dirfd不是AT_FDCWD则监控dirfd目录下的pathname如果pathname为相对路径dirfd是AT_FDCWD则监控当前工作目录下的pathname 3.3 三种监控模式 前面说过fanotify支持三种监控模式 directed只监控需要监控的文件或者目录如果是目录可以添加FAN_EVENT_ON_CHILD标志监控目录下的所有文件但是不会监控子目录下的文件per-mount和global模式下FAN_EVENT_ON_CHILD标志无效per-mount监控挂载点中的所有文件或者目录增加监控路径时设置FAN_MARK_MOUNT标志global监控整个文件系统增加监控路径时设置FAN_MARK_FILESYSTEM标志不过该选项是在4.20内核版本才支持 4 容器场景使用的问题 从上述可以看出fanotify在5.1内核增加了很多能力因此在使用时需要考虑内核的版本问题另外在容器场景也存在一些问题。 如果是监控主机上的路径directed结合FAN_EVENT_ON_CHILD标志就只能监控目录以及目录下的文件per-mount可以监控pathname所在的挂载点中所有文件或者目录的变化而global模式可以监控整个文件系统。 从功能实现角度来看如果需要监控某个路径下的文件变化希望可以只设置该路径就行也就是当监控/etc目录时也可以监控到/etc/xxx/目录下的文件变化。 如果是监控容器中的路径如果使用directed和global模式就跟主机上的一样监控merged路径如果使用per-mount由于不能跨命名空间需要使用setns进入到容器所在的命名空间再添加监控路径实现起来会麻烦很多。 在处理文件的变更事件时通过metadata-fd读取到的文件路径是容器中的路径metadata-pid是宿主机上的进程Pid通过/proc/pid/cgroup可以得到容器ID虽然可以根据容器ID调用docker或者CRI的接口获取merged路径但是也比较麻烦。 5 参考文档 监听容器中的文件系统事件
http://www.hkea.cn/news/14426570/

相关文章:

  • 手机wap网站特效网站优化标题怎么做
  • 深圳微信网站织梦建站教程
  • 营销网站科技私域视频
  • 玉溪市规划建设局网站竞价推广论坛
  • 专业展示设计网站WordPress书籍插件
  • 网站建设q a网站彩票做号
  • 旅游类网站开发开题报告范文wordpress如何修改首页
  • 设计素材网站哪个好用东莞市工商注册登记官网
  • 重庆网站制作1000网络营销推广的心得体会
  • 网站域名怎么进行实名认证免费做图软件电脑版
  • 庐江住房建设局网站太原网站建设方案推广
  • 设计网站室内北京logo设计公司哪家好
  • 石家庄城乡建设厅网站wordpress 翻页错误
  • 云上的网站怎么做等保常用来做网站首页的是
  • 我也来做外国网站购物平台网站功能
  • 谷歌地图嵌入网站企业展厅的作用
  • 长沙环路建设开发有限公司网站wordpress幻灯片
  • seo网站诊断html网站开场动画效果模板
  • 域名解析要登入哪个网站做北京网页制作培训班
  • 免费网站建站百度云网络文化经营许可证全国有多少张
  • 网站开发维护印花税厦门网站快速排名优化
  • 呢图网站场建设封面网站建设找业主签字模板
  • 阿里云1m服务器可以搭建网站wordpress 筛选
  • 跨境商城网站制作有了域名如何做网站
  • 网站建设结构设计哈尔滨百度网站排名
  • 安徽商会网站建设方案设计网站100个免费
  • php网站建设设计制作方案知名男艺人工作室
  • 无锡做网站公司在哪里flash工作室网站模板
  • 企业宣传网站建设需求说明书的模板好看网电影网站模板免费下载
  • 心理网站建设策划书制作游戏的软件手机版