mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.5 KiB
73 lines
1.5 KiB
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <sys/select.h>
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include "coupling.h"
|
|
|
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
|
#define CHUNKSIZE 44231
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
struct coupling *c = coupling_new_push(STDERR_FILENO);
|
|
int stderr_fd = coupling_nonblocking_fd(c);
|
|
|
|
int size;
|
|
if (argc == 2) {
|
|
size = atoi(argv[1]);
|
|
printf("size = %d\n", size);
|
|
} else {
|
|
printf("usage: ./test 123 2> stderr; wc -c stderr\n");
|
|
exit(1);
|
|
}
|
|
|
|
char *msg = malloc(CHUNKSIZE);
|
|
int i, r;
|
|
for (i = 0; i < CHUNKSIZE; i++) {
|
|
msg[i] = 'A' + i % 26;
|
|
}
|
|
|
|
int written = 0;
|
|
|
|
fd_set writefds, exceptfds;
|
|
|
|
FD_ZERO(&exceptfds);
|
|
FD_SET(stderr_fd, &exceptfds);
|
|
|
|
FD_ZERO(&writefds);
|
|
FD_SET(stderr_fd, &writefds);
|
|
|
|
while (written < size) {
|
|
r = select(stderr_fd+1, NULL, &writefds, &exceptfds, NULL);
|
|
if (r < 0) {
|
|
printf("test.c select(): %s\n", strerror(errno));
|
|
exit(1);
|
|
}
|
|
|
|
if (FD_ISSET(stderr_fd, &exceptfds)) {
|
|
printf("exception on stderr fd\n");
|
|
exit(1);
|
|
}
|
|
|
|
if (FD_ISSET(stderr_fd, &writefds)) {
|
|
r = write(stderr_fd, msg, MIN(size - written, CHUNKSIZE));
|
|
if (r < 0 && errno != EAGAIN) {
|
|
printf("test.c write(): %s\n", strerror(errno));
|
|
exit(1);
|
|
} else {
|
|
written += r;
|
|
printf("%d\n", written);
|
|
}
|
|
}
|
|
}
|
|
|
|
close(stderr_fd);
|
|
coupling_join(c);
|
|
coupling_destroy(c);
|
|
|
|
return 0;
|
|
}
|
|
|