Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

inotify file in C

Tags:

c

inotify

I am trying to run an example of inotify in C..but it's not working. I want to monitor modifications to a file (the file is tmp.cfg), but it doesn't work..I don't know if i'm running it correctly, because I understand how to monitor directories, but not a single file Here´s the example:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>
#include <unistd.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int main( int argc, char **argv )
{
  int length, i = 0;
  int fd;
  int wd;
  char buffer[BUF_LEN];

  fd = inotify_init();

  if ( fd < 0 ) {
    perror( "inotify_init" );
  }

  wd = inotify_add_watch( fd, "/home/name/tmp.cfg",
                         IN_MODIFY | IN_CREATE | IN_DELETE );
  length = read( fd, buffer, BUF_LEN );

  if ( length < 0 ) {
    perror( "read" );
  }

  while ( i < length ) {
    struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
      if ( event->mask & IN_CREATE ) {
          printf( "The file %s was created.\n", event->name );
      }
      else if ( event->mask & IN_DELETE ) {
          printf( "The file %s was deleted.\n", event->name );
      }
      else if ( event->mask & IN_MODIFY ) {
          printf( "The file %s was modified.\n", event->name );
      }
    i += EVENT_SIZE + event->len;
  }

  ( void ) inotify_rm_watch( fd, wd );
  ( void ) close( fd );

  return 0;
}

Once i run it, if i write something on the file and then save it, nothing happens. i've tryed debugging it..the problem seems to be the if ( event->mask & IN_MODIFY ), as it doesn't recognize it as a modification

like image 218
mar_sanbas Avatar asked Nov 12 '12 20:11

mar_sanbas


1 Answers

It doesn't work on a single file because, when we use a editor to modify file, the editor opens a copy of the file and when we save the edited version from the text editor, the existing file is deleted and a new file of the same name is created with the modifications.

When the old file is deleted, the watch created on that file becomes invalid and it is deleted automatically.

You can see the old file being replaced by the new file if you monitor the parent directory.

There are two ways to solve it, monitor the parent directory and print the message when modifications is done to the particular that you want to watch.

Else create a new watch on the file whenever modifications are made. When the old file is deleted, IN_DELETE_SELF event is triggered.

event->name will be non-empty only when you watch a directory, as it will contain the name of the file on which the event has occurred in the watched directory.

like image 164
jibin mathew Avatar answered Oct 01 '22 02:10

jibin mathew