gpt4 book ai didi

c++ - inotify 运行系统时出现的问题

转载 作者:行者123 更新时间:2023-11-28 03:41:41 25 4
gpt4 key购买 nike

我想监控一个文件夹。

每次弹出通知时,我都想运行系统命令行。使用系统命令时出现问题。每个新事件弹出 3 次,尽管它应该弹出一次。编辑:谢谢你重播。我发现了这个错误。系统执行了一个位于受监控文件夹内的文件夹。这就是为什么每次我在受监控的文件夹中放置一个文件夹时,事件都会打印 3 次。

代码------------

    /*

Simple example for inotify in Linux.

*/


#include <sys/inotify.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
int fd,wd,wd1,i=0,len=0;
char pathname[100],buf[1024];
struct inotify_event *event;

fd=inotify_init1(IN_NONBLOCK);
/* watch /test directory for any activity and report it back to me */

`wd=inotify_add_watch(fd,"/home/folder",IN_ALL_EVENTS`);

while(1){
//read 1024 bytes of events from fd into buf
i=0;
len=read(fd,buf,1024);
while(i<len){
event=(struct inotify_event *) &buf[i];


/* check for changes */
if(event->mask & IN_OPEN)
{ // printf("\n %s :was opened\n",event->name);
char*path="/home/folder/";
char*file=event->name;
int n=sizeof(path)+sizeof(file);
char *result=(char *)malloc(512);
strcpy(result,path); // copy string one into the result.
strcat(result,file); // append string two to the result
puts (result);

//printf("RESUULT:");

int pp=sizeof(result);
char *run="/home/test/./userr ";
int l=sizeof(run);

char *cmd=(char *)malloc(1000);
strcpy(cmd,run);
strcat(cmd,result);
puts (cmd);

system(cmd);
printf("\n %s :was opened\n",event->name);
//break;

}
if(event->mask & IN_MODIFY)
printf("%s : modified\n",event->name);

if(event->mask & IN_ATTRIB)
printf("%s :meta data changed\n",event->name);

if(event->mask & IN_ACCESS)
printf("%s :was read\n",event->name);

if(event->mask & IN_CLOSE_WRITE)
printf("%s :file opened for writing was closed\n",event->name);

// if(event->mask & IN_DELETE)
// printf("%s :deleted\n",event->name);

/* update index to start of next event */
i+=sizeof(struct inotify_event)+event->len;
}

}

}

编辑:

如何让 WHILE(1) 休眠 1 分钟?速度(60);弹出 inotify void:was opened 而不是 folder1:was opened 当我在受监控的文件夹中放置一个文件夹时

./执行

 :was opened
/home/folder/
:file opened not for writing was closed

在没有 sleep 的情况下(代码已发布)我有:

 1002_copy :was opened
/home/folder/1002_copy
1002_copy :file opened not for writing was closed

最佳答案

您正在 if 条件下运行 system(),每次看到打开的文件时都会调用该条件。

因此,只要您打开一个文件,它就会无限运行。您必须找到摆脱循环的方法。

当执行到换行符时,它会跳出内部的while,但是外部的while(1)呢?

按要求(工作代码):

#include <sys/inotify.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
int fd,wd,wd1,i=0,len=0;
char pathname[100],buf[1024];
struct inotify_event *event;

fd=inotify_init1(IN_NONBLOCK);
wd=inotify_add_watch(fd,"/tmp/temp",IN_ALL_EVENTS);
while(1){
//read 1024 bytes of events from fd into buf
i=0;
len=read(fd,buf,1024);
while(i<len){
event=(struct inotify_event *) &buf[i];
/* check for changes */
if(event->mask & IN_CREATE){
system("/bin/date");
}
i+=sizeof(struct inotify_event)+event->len;
}
}
}

每次将文件添加到/tmp/temp 时,上面的代码都会执行 $date 命令。修改它以满足您的需要。

关于c++ - inotify 运行系统时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8986669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com