#include <sys/types.h>
#include <sys/event.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
static void *domaster(void *arg);
static void *doslave(void *arg);
int
main(int ac, char **avj)
{
int fd;
int r;
struct kevent kev;
pthread_t td1;
pthread_t td2;
fd = kqueue();
EV_SET(&kev, 1, EVFILT_USER, EV_ADD|EV_CLEAR, 0, 0, 0);
r = kevent(fd, &kev, 1, NULL, 0, NULL);
printf("r = %d\n", r);
pthread_create(&td1, NULL, domaster, (void *)(intptr_t)fd);
sleep(1);
pthread_create(&td2, NULL, doslave, (void *)(intptr_t)fd);
pthread_join(td1, NULL);
pthread_join(td2, NULL);
}
static void *
domaster(void *arg)
{
struct kevent kev;
int fd = (int)(intptr_t)arg;
int r;
printf("master running\n");
for (;;) {
EV_SET(&kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, 0);
r = kevent(fd, &kev, 1, NULL, 0, NULL);
printf("issued trigger %d\n", r);
sleep(1);
}
return NULL;
}
static void *
doslave(void *arg)
{
struct kevent kev;
int fd = (int)(intptr_t)arg;
int r;
printf("slave running\n");
for (;;) {
r = kevent(fd, NULL, 0, &kev, 1, NULL);
printf("received %d\n", r);
}
return NULL;
}