IOPROC(2)IOPROC(2)
NAME
closeioproc, iocall, ioclose, ioflush, iointerrupt, iodial, ioopen, ioproc, ioread, ioreadn, iosleep, iowrite – slave I/O processes for threaded programs
SYNOPSIS
unhandled troff command .de
unhandled troff command .ift
unhandled troff command .ifn
unhandled troff command ..
#include <u.h> #include <libc.h> #include <thread.h>unhandled troff command .sp
typedef struct Ioproc Ioproc;
unhandled troff command .sp
Ioproc* ioproc(void);
unhandled troff command .XX
int ioopen(Ioproc *io, char *file, int omode); int ioclose(Ioproc *io, int fd); long ioread(Ioproc *io, int fd, void *a, long n); long ioreadn(Ioproc *io, int fd, void *a, long n); long iowrite(Ioproc *io, int fd, void *a, long n); int iodial(Ioproc *io, char *addr, char *local, char *dir, int *cdfp); int iosleep(Ioproc *io, long n);
unhandled troff command .XX
int ioflush(Ioproc *io); void iointerrupt(Ioproc *io); void closeioproc(Ioproc *io);
unhandled troff command .XX
long iocall(Ioproc *io, long (*op)(va_list *arg), ...);
DESCRIPTION
These routines provide access to I/O in slave procs. Since the I/O itself is done in a slave proc, other threads in the calling proc can run while the calling thread waits for the I/O to complete.
EXAMPLE
Relay messages between two file descriptors, counting the total number of bytes seen:
int tot;
void
relaythread(void *v)
{
int *fd, n;
char buf[1024];
Ioproc *io;
fd = v;
io = ioproc();
while((n = ioread(io, fd[0], buf, sizeof buf)) > 0){
if(iowrite(io, fd[1], buf, n) != n)
sysfatal("iowrite: %r");
tot += n;
}
closeioproc(io);
}
void
relay(int fd0, int fd1)
{
int fd[4];
fd[0] = fd[3] = fd0;
fd[1] = fd[2] = fd1;
threadcreate(relaythread, fd, 8192);
threadcreate(relaythread, fd+2, 8192);
}
If the two
Implement
static long
_ioread(va_list *arg)
{
int fd;
void *a;
long n;
fd = va_arg(*arg, int);
a = va_arg(*arg, void*);
n = va_arg(*arg, long);
return read(fd, a, n);
}
long
ioread(Ioproc *io, int fd, void *a, long n)
{
return iocall(io, _ioread, fd, a, n);
}