#include #include #include #include #include #include #include #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; }