Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 02 May 2001 21:24:42 -0000
From:      "Dominic Marks" <dominic_marks@hotmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   KEvent doesnt return and KEvent sample troubles
Message-ID:  <F45sAitVGeSJIEoPXCF00000265@hotmail.com>

next in thread | raw e-mail | index | archive | help
I've been looking to start using the KEvent system and I've been 
experimenting with it. However I've been having several problems, with my 
own code as well as samples from http://www.flugsvamp.org.

It appears I am able to create the correct structure's and register the 
events. However the event never returns and never responds to any action. 
For example if I use a sample which monitors the actions on a file I can 
read from, and write to the file and it shows no sign of noticing.

I was wondering if it's simply a mistake of my own, however the failure for 
the samples I've found has puzzled my further. I'm working on a 4.3-STABLE 
machine using GCC version 2.95.3.

Here is an example of code that I am using which doesn't seem to catch any 
events. Its a slightly modified version of read_test.c from flugsvamp.com 
which I edit so it would compile happily.

It doesn't seem to work however.

>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <aio.h>
#include <sys/errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/event.h>
#include <sys/time.h>
#include <sys/syscall.h>

main(int argc, char **argv)
{
	int fd, kq, n;
	struct kevent event[1];
	struct kevent *evp[1];
	char buffer[128];
	struct stat st;
	struct aiocb iocb;
  struct timespec ts = {0, 0};

	if (argc != 2)
		errx(1, "Usage: %s file\n", argv[0]);

	fd = open(argv[1], O_RDONLY);
	if (fd < 0)
		err(1, "open: %s\n", argv[1]);

	lseek(fd, 0, SEEK_END);

        kq = syscall(SYS_kqueue);
        if (kq < 0)
                err(1, "kqueue");

	event[0].ident = fd;
	event[0].filter = EVFILT_READ;
	event[0].flags = EV_ADD | EV_ENABLE;
	evp[0] = &event[0];
	n = syscall(SYS_kevent, kq, 1, evp, 0, NULL, 0);

	for (;;) {
		n = syscall(SYS_kevent, kq, 0, NULL, 1, event, ts);
		if (n < 0)
			err(1, "kevent");
		printf("kevent flags: 0x%x, data: 0x%x\n",
		    event[0].flags, event[0].data);

		n = read(fd, buffer, 128);
		buffer[n] = '\0';
		printf("%s", buffer);
	}
}
<

I'd appreciate any feedback very much.

Thank you
Dominic Marks
_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




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