#include #include #include #include #include #include #include #include #define DIE(x)\ {\ fprintf(stderr, "Assertion failed: " #x " file: %s, line:%d, errno:%d ", __FILE__, __LINE__, errno); \ perror(". Error:");\ fflush(stdout);\ abort();\ } #define ASS(x) if (!(x)) DIE(x) #define ASS1(x) ASS((x) != -1) #define ASS0(x) ASS((x) == 0) void * deadlocker(void *arg) { int fd = (int)(ptrdiff_t)arg; for (;;) { ASS1( lockf(fd, F_LOCK, 1) ); ASS1( lockf(fd, F_ULOCK, 1) ); } return NULL; } int main(int argc, char * argv[]) { int fd1, fd2; ASS( argc >= 3 ); ASS1( fd1 = creat(argv[1], 0660) ); ASS1( fd2 = creat(argv[2], 0660) ); void * thrv; pthread_t thr1, thr2; ASS0( pthread_create(&thr1, NULL, deadlocker, (void *)(ptrdiff_t)fd2) ); ASS0( pthread_create(&thr2, NULL, deadlocker, (void *)(ptrdiff_t)fd1) ); ASS0( pthread_join(thr1, &thrv) ); ASS0( pthread_join(thr2, &thrv) ); return 0; }