Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Aug 1996 19:37:16 -0700 (PDT)
From:      Archie Cobbs <archie@whistle.com>
To:        freebsd-hackers@freebsd.org
Subject:   flock() broken on certain files
Message-ID:  <199608040237.TAA05031@bubba.whistle.com>

next in thread | raw e-mail | index | archive | help

How hard would it be to get flock() to work on a fifo? Right now
it seems that it doesn't... could someone else verify this?

It seems that fifo's are exactly the kind of thing you would want
to be able to set a lock on, e.g., when multiple processes are writing
to it.

Here's a sample program:


    /* foo.c */

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <err.h>

    int
    main()
    {
      int	fd;
      FILE	*fp;

      fd = open("fifo", O_WRONLY, O_EXLOCK | O_NONBLOCK);
      if (fd < 0)
      {
	warn("pid %lu: open", getpid());
	exit(1);
      }
      if ((fp = fdopen(fd, "a")) == NULL)
      {
	warn("pid %lu: fdopen", getpid());
	exit(1);
      }
      warnx("pid %lu opened fifo", getpid());
      sleep(5);
      fprintf(fp, "pid %lu reporting 1\n", getpid());
      fflush(fp);
      sleep(5);
      fprintf(fp, "pid %lu reporting 2\n", getpid());
      fflush(fp);
      sleep(5);
      fprintf(fp, "pid %lu reporting 3\n", getpid());
      fflush(fp);
      warnx("pid %lu exiting", getpid());
      return(0);
    }


The open()'s are not being blocked, even though O_EXLOCK is specified:


    $$ mkfifo fifo
    csh: cat fifo > /dev/null &
    [3] 5017
    $$ ./foo &
    [4] 5018
    foo: pid 5018 opened fifo
    $$ ./foo &
    [5] 5019
    foo: pid 5019 opened fifo
    $$ wait
    foo: pid 5018 exiting

    [4]    Done                          ./foo
    foo: pid 5019 exiting

    [5]    Done                          ./foo

    [3]    Done                          cat fifo > /dev/null
    $$

-Archie

___________________________________________________________________________
Archie L. Cobbs, archie@whistle.com  *  Whistle Communications Corporation



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199608040237.TAA05031>