ptg10805159
654 Advanced IPC Chapter 17
Themainfunction (Figure17.18) is a loop that reads a pathname from standard
input and copies the file to standardoutput. The function callscsopento contact the
open server and return an open descriptor.
#include "open.h"
#include <fcntl.h>
#define BUFFSIZE 8192
int
main(int argc, char *argv[])
{
int n, fd;
char buf[BUFFSIZE];
char line[MAXLINE];
/* read filename to cat from stdin */
while (fgets(line, MAXLINE, stdin) != NULL) {
if (line[strlen(line) - 1] == ’\n’)
line[strlen(line) - 1] = 0; /* replace newline with null */
/* open the file */
if ((fd = csopen(line, O_RDONLY)) < 0)
continue; /* csopen() prints error from server */
/* and cat to stdout */
while ((n = read(fd, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < 0)
err_sys("read error");
close(fd);
}
exit(0);
}
Figure 17.18The clientmainfunction, version 1
The functioncsopen(Figure17.19) does theforkandexecof the server,after
creating the fd-pipe.
#include "open.h"
#include <sys/uio.h> /* struct iovec */
/*
*Open the file by sending the "name" and "oflag" to the
*connection server and reading a file descriptor back.
*/
int
csopen(char *name, int oflag)
{
pid_t pid;
int len;