#include #include #include #include #include "ucore/iomux.h" extern struct IOMuxFD s_fd; void stdin_read_cb(struct IOMux *mux, struct IOMuxFD *fd, unsigned int event) { char buf[4096]; ssize_t len = read(fd->fd, buf, sizeof buf); if (len <= 0) { perror("read"); fprintf(stderr,"Unregister stdin fd %d\n", fd->fd); iomux_unregister_fd(mux, fd); close(fd->fd); close(fd->cookie_int); } else write(fd->cookie_int, buf, len); } void pipe_read_cb(struct IOMux *mux, struct IOMuxFD *fd, unsigned int event) { char buf[4095]; ssize_t len = read(fd->fd, buf, sizeof buf); if (len <= 0) { perror("pipe read"); printf("Unregister pipe fd %d [stdout]\n", fd->fd); fprintf(stderr,"Unregister pipe fd %d[stderr]\n", fd->fd); iomux_unregister_fd(mux, fd); close(fd->cookie_int); fclose(fd->cookie_ptr); } else { fwrite(buf, 1 , len, fd->cookie_ptr); fflush(fd->cookie_ptr); } } void *writer(void *arg) { struct IOMux *mux = arg; iomux_run(mux); printf("writer mux returned\n"); return NULL; } int main(int argc, char *argv[]) { struct IOMux *mux1 = iomux_create(IOMUX_TYPE_DEFAULT); struct IOMux *mux2 = iomux_create(IOMUX_TYPE_DEFAULT); int pfd[2]; int rc; struct IOMuxFD fd1 = {0}; struct IOMuxFD fd2 = {0}; pthread_t tid; pipe(pfd); fd1.fd = 0; fd1.what = MUX_EV_READ; fd1.cookie_int = pfd[1]; fd1.callback = stdin_read_cb; fd2.fd = pfd[0]; fd2.what = MUX_EV_READ; fd2.cookie_ptr = fopen("out", "wb"); fd2.callback = pipe_read_cb; rc = iomux_register_fd(mux1, &fd1); if (rc != 0) printf("Cannot register fd1: %s\n", strerror(rc)); rc = iomux_register_fd(mux2, &fd2); if (rc != 0) printf("Cannot register fdw: %s\n", strerror(rc)); pthread_create(&tid,NULL,writer,mux2); iomux_run(mux1); printf("reader mux returned\n"); pthread_join(tid, NULL); iomux_delete(mux1); iomux_delete(mux2); return 0; }