#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

#ifndef AT_FDCWD
#define AT_FDCWD -100
#endif

#if defined(__i386__)
#define __NR_revokeat   324
#else
#error unsupported arch
#endif

int revokeat(int dfd, const char *path)
{
        return syscall(__NR_revokeat, dfd, path);
}

#define BUFFER_SIZE 1024

static const char buffer[BUFFER_SIZE];

#define SHARED_FILE "/tmp/shared"

#define MAX_WRITES 1000
#define MAX_TRIES 1000
#define MAX_CHILDREN 20

static void try_to_write(void)
{
	int i, fd;

	//printf("Process %i writing to file %s...\n", getpid(), SHARED_FILE);
	fd = open(SHARED_FILE, O_RDWR | O_TRUNC);
	if (!fd) {
		//perror("open");
		return;
	}
	for (i = 0; i < MAX_WRITES; i++) {
		int err;
		
		err = write(fd, buffer, BUFFER_SIZE);
		//if (err < 0)
			//perror("write");
	}
	close(fd);
}

static void try_to_revoke_and_write(void)
{
	int i;

	//for (i = 0; i < MAX_TRIES; i++) {
	for (;;) {
		int err;

		err = revokeat(AT_FDCWD, SHARED_FILE);
		if (err) {
			//perror("revokeat");
			continue;
		}
		try_to_write();
	}
}

int main(int argc, char *argv[])
{
	int fd, i;

	fd = open(SHARED_FILE, O_CREAT);
	if (!fd) {
		//perror("open");
		return 1;
	}
	for (i = 0; i < MAX_CHILDREN; i++) {
		if (fork() == 0)
			break;
	}
	try_to_revoke_and_write();
	return 0;
}

