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);
    //~ }
//~ }

Reply via email to