directory notifications lost after fork?

From: Oskar Liljeblad (oskar@osk.mine.nu)
Date: Sun Mar 10 2002 - 16:08:02 EST


The code snipper demonstrates what I consider a bug in the
dnotify facilities in the kernel. After a fork, all registered
notifications are lost in the process where they originally
where registered (the parent process). "lost" here means that
the signal specified with F_SETSIG fcntl no longer is delivered
when notified.

How to reproduce (tested with 2.4.17):
  gcc -o dnoticebug dnoticebug.c
  dnoticebug & # run in background
  cat dnoticebug.c >/dev/null # "notified" should now be printed
  cat dnoticebug.c >/dev/null # nothing is printed this time
  
If you comment out the line with fork below, "notified" *will* be
printed every time you cat dnoticebug.c.

I'm not subscribed to the list so I'd appreciate if you CCed me.
(Otherwise I'd have to use the archives :) Thanks.

Oskar Liljeblad (oskar@osk.mine.nu)

===

#define _GNU_SOURCE
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

static void handler(int sig, siginfo_t *si, void *data)
{
        printf("notified\n");
}

int main(void)
{
        struct sigaction act;
        int fd;

        act.sa_sigaction = handler;
        sigemptyset(&act.sa_mask);
        act.sa_flags = SA_SIGINFO;
        sigaction(SIGRTMIN, &act, NULL);

        fd = open(".", O_RDONLY);
        fcntl(fd, F_SETSIG, SIGRTMIN);
        fcntl(fd, F_NOTIFY, DN_ACCESS|DN_MULTISHOT);

        while (1) {
                pause();
                if (fork() <= 0) exit(0);
                wait(NULL);
        }
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Mar 15 2002 - 22:00:14 EST