运行系统时会出现问题

时间:2012-01-24 12:18:32

标签: c++ c inotifypropertychanged

我想要监控一个文件夹。

每次弹出通知时,我都想运行系统命令行。 使用系统命令时出现问题。每个新事件弹出3次虽然它应该弹出一次。 编辑: Thx为你重播。我发现了这个bug。系统执行了受监控的foder内部的文件夹。这就是为什么每次我在监控文件夹中放置一个foder时,事件被打印了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;
            }

        }

    }

编辑:

我怎样才能在1分钟内休息一会儿? SPEEP(60);弹出inotify void:打开而不是folder1:当我将一个foder放入受监控的文件夹时打开了

./ EXEC

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

在没有睡觉的同时(发布的代码)我有:

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

2 个答案:

答案 0 :(得分:1)

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

因此,无论何时打开文件,它都会无限运行。你必须找到摆脱循环的方法。

当执行到达换行符时,它会突破内部,但外部while(1)呢?

AS REQUESTED(工作代码):

#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命令。修改它以满足您的需求。

答案 1 :(得分:1)

您的系统命令在做什么?它是否打开你正在改变的文件?如果是这样,这不会导致您的代码再次运行并使您进入无限循环(这显然是您所看到的)吗?

修改 - an article in Linux Journal正在做与您非常相似的事情。我注意到他们正在使用更大的缓冲区并且注释提到了有关结构对齐的内容,因此您可能会得到一个错误的事件长度,导致缓冲区溢出并强制您的代码循环超过预期。

以太方式,我会检查(使用一些printf调试逻辑)你正在按预期循环。