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);
}