lockf: Invalid argument on pipe

Timothy Redaelli timothy at redaelli.eu
Mon Mar 9 15:20:54 PDT 2009


Hi,
Why can't I do a lockf on a file descriptor that does not point a real
file (such as stderr, stdout, or a character device)?

Since it works under NetBSD, Linux, Solaris. For portability between
systems I hope I can do it under FreeBSD.

The following code is simple, but It reproduce the problem.
Under non-FreeBSD systems, It will block before the puts. Instead
under FreeBSD the lockf calls return error and, so, the lock does not
works.

Any suggest?

<snip>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
        char tmp[256];

        if (lockf(2, F_LOCK, 0) == -1)
                perror("lock");
        snprintf (tmp, 256, "%s XXX", argv[0]);
        if (!argv[1] || strcmp(argv[1], "XXX"))
                system(tmp);
        puts("You should see it only after ctrl+c");
        return EXIT_SUCCESS;
}
<end snip>

-- 
Timothy Redaelli
IT Consultant
Email: timothy at redaelli.eu
Mobile: +39 (338) 1187273
WWW:  http://www.redaelli.eu/


More information about the freebsd-hackers mailing list