Files
libucore/test/iomux_test2.c
T
2014-09-12 01:11:41 +02:00

89 lines
2.1 KiB
C

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#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;
}