为什么不能在c语言中使用inotifyd找到第二个新事件

问题描述

我正在尝试检查在特定目录中创建或删除的新事件。 如果事件被创建,则需要使用线程进行一些操作,并且该线程应该处于启动 wile 循环中。 主线程应该寻找另一个事件创建或删除

我已经开发了应用程序,但我无法创建第二个事件。 代码流始终在子线程中。

请找到以下代码

    #include <errno.h>
   #include <poll.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/inotify.h>
   #include <unistd.h>
   #include <string.h>
   #define PATH_MAX        4096
   #define O_RDONLY      00

    int main()
   {
       //char buf;
       char buf[4096]
           __attribute__ ((aligned(__alignof__(struct inotify_event))));
       int fd,i,poll_num;
       int *wd;
       nfds_t nfds;
       struct pollfd fds[0];
       char *device_path = "/home/home/test";
       ssize_t len;
       const struct inotify_event *event;       
       int counter=0;
       char getdata[10];
       char devname[PATH_MAX];
       char *filename;
       int thread_ret = 0;
       static pthread_t inotify_pthread;
       
       

       /* Create the file descriptor for accessing the inotify API */

       fd = inotify_init1(IN_NONBLOCK);
       printf("fd = %d",fd);
       if (fd == -1) {
           perror("inotify_init1");
           exit(EXIT_FAILURE);
       }

      

       /* Mark directories for events
          - file was opened
          - file was closed */

       
           wd = inotify_add_watch(fd,device_path,IN_OPEN | IN_CLOSE | IN_CREATE | IN_DELETE);
           printf("wd = %d ",wd);
           if (wd == -1) {
               fprintf(stderr,"Cannot watch '%s': %s\n",strerror(errno));
               exit(EXIT_FAILURE);
           }
       

       /* Prepare for polling */

       nfds = 1;
   

       /* Inotify input */

       fds[0].fd = fd;
       fds[0].events = POLLIN;

       /* Wait for events and/or terminal input */

       printf("Listening for events.\n");
       while (1) {
           poll_num = poll(fds,nfds,-1);
           if (poll_num == -1) {
               if (errno == EINTR)
                   continue;
               perror("poll");
               exit(EXIT_FAILURE);
           }

           if (poll_num > 0) {             
               if (fds[0].revents & POLLIN) {

                   /* Inotify events are available */

                   len = read(fd,buf,sizeof(buf));

                   if (len == -1 && errno != EAGAIN) {
                        perror("read");
                        exit(EXIT_FAILURE);
                    }

                    if (len <= 0)
                        break;

                    

        for (char *ptr = buf; ptr < buf + len;
                    ptr += sizeof(struct inotify_event) + event->len) {

                   event = (struct inotify_event *) ptr;
        if ( event->len ) {

           
                    

               /* Print event type */
                if (event->mask & IN_CREATE){
                   printf("IN_CREATE: \n");
                    if (event->len){
                        counter++;
                   printf("IN_CREATE: created file name : %s,counter no = %d \n",event->name,counter); 
                      
                      

                    thread_ret = pthread_create(&inotify_pthread,NULL,event_read_data(),NULL);
   
                        if (thread_ret < 0) {
                        printf("can't create inotify thread");
                        exit(EXIT_FAILURE);
                        }
                   


                    }
                   
                   }                
                   else if (event->mask & IN_DELETE){
                        counter--;
                       printf( "IN_DELETE : Deleted File name %s,counter );
                       
                   }
                }

                printf("counter number : %d \n",counter);          
             
           }
                   
               }
           }
       }

       printf("Listening for events stopped.\n");

     

       close(fd);

       free(wd);
       exit(EXIT_SUCCESS);
   }
   event_read_data(){

    while(1){
       printf("Child Thread");
       sleep(3);
    }
   }

  Compiled like below:
  gcc fine_name.c -lpthread

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)