This test was taken from the python test suite. It works on many different platforms and architecture's except cygwin's. I'm not entirely sure that cygwin is really wrong either though.
The attached c program should print only a single message: lock failed in parent (expected) 13 However it also prints: unlock failed in parent (not expected) 13 -bash-3.1$ uname -a CYGWIN_NT-5.1 stella 1.7.0s(0.159/4/2) 20060802 23:48:39 i686 Cygwin Also happens with 1.5.19 and 20 I'm pretty sure. Please copy me on any follow up. n
#include <stdio.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> static void lock(int fd, const char *where, const char *expected) { struct flock lf = { .l_type = F_WRLCK, 0 }; int err = fcntl(fd, F_SETLK, &lf); if (err < 0) fprintf(stderr, "lock failed in %s (%sexpected) %d\n", where, expected, errno); } static void unlock(int fd, const char *where, const char *expected) { struct flock lf = { .l_type = F_UNLCK, 0 }; int err = fcntl(fd, F_SETLKW, &lf); if (err < 0) fprintf(stderr, "unlock failed in %s (%sexpected) %d\n", where, expected, errno); } int main(int argc, char**argv) { // int fd = open("foo", O_WRONLY | O_CREAT); int fd = fileno(fopen("foo", "w")); int err, pid = fork(); if (pid < 0) { fprintf(stderr, "fork error\n"); return -1; } // in child if (pid == 0) { lock(fd, "child", "not "); sleep(2); unlock(fd, "child", "not "); _exit(0); } sleep(1); lock(fd, "parent", ""); // file isn't locked in child, but there should not be an error on cygwin unlock(fd, "parent", "not "); sleep(2); return 0; }
-- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/