如何监控源文件夹和目标文件夹中的数据?

How to monitor the data in both source and destination folders?

我正在做一个文件监控系统项目,首先将所有数据复制到目标文件夹,然后它应该监控源文件夹和目标文件夹中的数据。但不幸的是,它只是监控来自源文件夹.

的数据

我将 inotify 函数 分为两部分,因为我使用 inotifyFunc1 帮助我先复制文件夹。一旦数据被复制,我就使用 inotifyFunc2 来监控 两个文件夹 中的数据。但正如我所说,它只是监视第一个 源文件夹。

这段代码很长,但我不知道如何简短地理解它。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/inotify.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>

#define STRING_LEN 200
#define MAX_EVENTS 1024
#define NAME_LEN 16
#define EVENT_SIZE (sizeof(struct inotify_event))
#define BUFFER_LEN (MAX_EVENTS * (EVENT_SIZE + NAME_LEN))

typedef struct{
    int fd, wd, result, length;
    uint32_t mask[2];
    char path1[STRING_LEN], path2[STRING_LEN], cmd[STRING_LEN], option, buffer[BUFFER_LEN];
} monitoring;

monitoring monitor;

void sig_handler(int signal){
    printf("\nThe program is closed\n");
    inotify_rm_watch(monitor.fd, monitor.wd);
    close(monitor.fd);
    exit(0);
}

void inotifyFunc1(char *path1, uint32_t *maskPtr1){
    monitor.fd = inotify_init();
    if(fcntl(monitor.fd, F_SETFL, O_NONBLOCK)){
       perror("inotify not initialized: ");
       exit(0);
    }

    monitor.wd = inotify_add_watch(monitor.fd, path1, *maskPtr1);
    if(monitor.wd < 0){
        perror("Sorry");
        exit(1);
    }
}

void inotifyFunc2(char *path2, uint32_t *maskPtr2)
{
    while(1)
    {
        int i = 0;
        monitor.length = read(monitor.fd, monitor.buffer, BUFFER_LEN);
        while(i<monitor.length){
            struct inotify_event *event = (struct inotify_event *)&monitor.buffer[i];
            if(event->len){
                if(event->mask & *maskPtr2){
                    if(event->mask & IN_ISDIR){
                        printf("Directory is created\n");
                        break;
                    }
                    else{
                        printf("File is created\n");
                        break;
                    }
                }
            }
        }
    }
}

void monitoringSystem(char *pathname1, char *pathname2)
{
    /* Closing inotify */
    signal(SIGINT,sig_handler);
    do
    {
        printf("Choose the source path: ");
        scanf("%s", pathname1);

        monitor.mask[0] = ENOENT;
        inotifyFunc1(pathname1, &monitor.mask[0]);

        printf("Choose the destination path: ");
        scanf("%s", pathname2);
        inotifyFunc1(pathname2, &monitor.mask[0]);
        
        monitor.result = strcmp(pathname1, pathname2);
        if(monitor.result == 0){
            printf("Error: Both locations are the same\n");
            exit(3);
        }
        else{
            sprintf(monitor.cmd, "cp -r %s %s", pathname1, pathname2);
            system(monitor.cmd);
            printf("Data is copied from source to destination\n");
        }

        printf("\nBoth locations are being monitored\n");
        monitor.mask[1] = IN_CREATE;
        inotifyFunc1(pathname1, &monitor.mask[1]);
        inotifyFunc2(pathname1, &monitor.mask[1]);

        inotifyFunc1(pathname2, &monitor.mask[1]);
        inotifyFunc2(pathname2, &monitor.mask[1]);
    
        printf("Do you want to give location again? [y/n]: ");
        scanf("%s", &monitor.option);
    } while(monitor.option == 'y');
}

int main(int argc, char *argv[])
{
    printf("DATA RECOVERY SYSTEM\n");
    printf("WELCOME TO THE MAIN MENU\n\n");

    monitoringSystem(monitor.path1, monitor.path2);
    
    return 0;
}
    void inotifyFunc1(char *path1, uint32_t *maskPtr1){
        monitor.fd = inotify_init();

您的 inotifyFunc1 函数创建了一个全新的 inotify 实例并将其句柄存储在 monitor.fd 中。

        inotifyFunc1(pathname1, &monitor.mask[0]);

        printf("Choose the destination path: ");
        scanf("%s", pathname2);
        inotifyFunc1(pathname2, &monitor.mask[0]);

但是你调用了两次。第二次,它再次创建一个新的 inotify 实例并将其句柄存储在 monitor.fd 中,泄漏旧句柄。

如果你只想让一个inotify实例观看不止一件事,你只需要创建一个inotify实例。

        inotifyFunc1(pathname1, &monitor.mask[1]);
        inotifyFunc2(pathname1, &monitor.mask[1]);

这也说不通。你为什么又打电话给inotifyFunc1?如果您认为它已经在监视这两个位置,您认为这完成了什么?如果你不认为它已经在监视两个位置,为什么你说是?

很难解释是什么不正确的推理导致您调用这些函数,因为代码中没有注释。但是没有意义。

您想:

  1. 只创建一个 inotify 个实例。
  2. 每个位置只添加一次。