This is what I'm talking about.
#include <err.h>
#include <stdio.h>
#include <sys/event.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
int i;
int k;
int kq;
int integer;
int Pipe[2];
struct kevent ke;
kq = kqueue();
if (kq == -1)
err(1, "kq!");
for (i = 0; i < 2000; ++i)
{
if (pipe(Pipe) == -1)
err(1, "pipe!");
integer = fork();
switch(integer)
{
case -1:
err(1, "fork!");
case 0:
close(Pipe[STDOUT_FILENO]);
recv(Pipe[STDIN_FILENO], &i, sizeof(int), MSG_WAITALL);
close(Pipe[STDIN_FILENO]);
_exit(0);
default:
break;
}
close(Pipe[STDIN_FILENO]);
EV_SET(&ke, integer, EVFILT_PROC, EV_ADD | EV_ONESHOT, NOTE_EXIT, 0, NULL);
if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
err(1, "kevent");
close(Pipe[STDOUT_FILENO]);
k = kevent(kq, NULL, 0, &ke, 1, NULL);
if (k == -1)
err(1, "k == -1");
if(ke.flags & EV_ERROR)
err(1, "EV_ERROR");
if (!(ke.fflags & NOTE_EXIT))
errx(1, "not NOTE_EXIT");
printf("%d\n", i);
}
}
//~ int main()
//~ {
//~ int i;
//~ int integer;
//~ for (i = 0; i < 2000; ++i)
//~ {
//~ integer = fork();
//~ switch(integer)
//~ {
//~ case -1:
//~ err(1, "fork!");
//~ case 0:
//~ _exit(0);
//~ default:
//~ break;
//~ }
//~ wait(NULL);
//~ printf("%d\n", i);
//~ }
//~ }