Files
libucore/test/iomux_pipe_close.c
T
Nils O. Selåsdal 44d8d10d35 Exampel code for pipe
2015-12-10 12:31:20 +01:00

81 lines
1.5 KiB
C

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include "ucore/iomux.h"
void in_cb(struct IOMux *mux, struct IOMuxFD *fd, unsigned int event)
{
char buf[16];
ssize_t rc;
rc = read(fd->fd, buf, sizeof buf);
printf("Read returned %ld\n", (long)rc);
if (rc <= 0) {
if (rc == -1 && errno == EAGAIN) {
return;
} else if (rc == -1) {
perror("read");
}
return;
}
iomux_unregister_fd(mux, fd);
close(fd->fd);
}
void out_cb(struct IOMux *mux, struct IOMuxFD *fd, unsigned int event)
{
char str[] = "hello";
ssize_t rc;
rc = write(fd->fd, str, strlen(str));
printf("write returned %ld\n", (long)rc);
if (rc <= 0) {
if (rc == -1 && errno == EAGAIN) {
return;
} else {
perror("write");
}
iomux_unregister_fd(mux, fd);
}
}
int main(int argc, char *argv[])
{
int pipes[2];
pipe(pipes);
uc_set_nonblocking(pipes[0]);
uc_set_nonblocking(pipes[1]);
struct IOMuxFD rfd= {
.fd = pipes[0],
.what = MUX_EV_READ,
.callback = in_cb,
};
struct IOMuxFD wfd= {
.fd = pipes[1],
.what = MUX_EV_WRITE,
.callback = out_cb,
};
signal(SIGPIPE, SIG_IGN);
struct IOMux *mux = iomux_create(IOMUX_TYPE_SELECT);
iomux_register_fd(mux, &rfd);
iomux_register_fd(mux, &wfd);
iomux_run(mux);
return 0;
}