#include #include #include #include #include #include #include #include typedef struct test_message { long mtype; char mtext[512 - sizeof(long)]; } test_message; static int test_pipe(void); static int test_msg(void); int main(int argc, char *argv[]) { if(test_pipe() < 0) return 1; if(test_msg() < 0) return 1; return 0; } static int test_pipe(void) { int p[2]; char buf[512]; int done; int rc; if (pipe(p) < 0) { perror("pipe(2)"); return -1; } if (fcntl(p[1], F_SETFL, O_NONBLOCK) < 0) { perror("fcntl(2)"); return -1; } for(done = 0; ; ) { if ((rc = write(p[1], buf, sizeof(buf))) != sizeof(buf)) { if (rc < 0) { extern int errno; if (errno == EAGAIN) { printf("Pipe buffer is %d bytes\n", done); return 0; } perror("write(2)"); return -1; } fprintf(stderr, "whatever happened - rc = %d on write(2)\n", rc); return -1; } done += rc; } fprintf(stderr, "Endless write loop returned - what's that?\n"); return -1; } static int test_msg(void) { int mq; test_message msg; int done; if ((mq = msgget(IPC_PRIVATE, IPC_CREAT | 0600)) < 0) { perror("msgget(2)"); return -1; } for (done = 0; ; ) { msg.mtype = 1; if (msgsnd(mq, &msg, sizeof(msg), IPC_NOWAIT) < 0) { extern int errno; if (errno == EAGAIN) { printf("Sys-V message queue buffer is %d bytes\n", done); return 0; } perror("msgsnd(2)"); return -1; } done += sizeof(msg); } fprintf(stderr, "Endless write loop returned - what's that?\n"); return -1; }