#include<stdarg.h>
#include<syslog.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
#include<errno.h>
#define MAXLINE 4096
void err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf, MAXLINE, fmt, ap);
if (errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
strerror(error));
strcat(buf, " ");
fflush(stdout);
fputs(buf, stderr);
fflush(NULL);
}
void err_sys(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, LOG_ERR, fmt, ap);
va_end(ap);
exit(1);
}
void err_quit(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(0, LOG_ERR, fmt, ap);
va_end(ap);
exit(1);
}
void Pipe(int *fds)
{
if (pipe(fds) < 0)
err_sys("pipe error");
}
pid_t Waitpid(pid_t pid, int *iptr, int options)
{
pid_t retpid;
if ( (retpid = waitpid(pid, iptr, options)) == -1)
err_sys("waitpid error");
return(retpid);
}
pid_t Fork(void)
{
pid_t pid;
if ( (pid = fork()) == -1)
err_sys("fork error");
return(pid);
}
char * Fgets(char *ptr, int n, FILE *stream)
{
char *rptr;
if ( (rptr = fgets(ptr, n, stream)) == NULL && ferror(stream))
err_sys("fgets error");
return (rptr);
}
void Write(int fd, void *ptr, size_t nbytes)
{
if (write(fd, ptr, nbytes) != nbytes)
err_sys("write error");
}
ssize_t Read(int fd, void *ptr, size_t nbytes)
{
ssize_t n;
if ( (n = read(fd, ptr, nbytes)) == -1)
err_sys("read error");
return(n);
}
void Close(int fd)
{
if (close(fd) == -1)
err_sys("close error");
}
void Client(int readfd, int writefd)
{
#define MAXLEN 4096
size_t len;
ssize_t n;
char buff[MAXLEN];
Fgets(buff, MAXLEN, stdin);
len = strlen(buff);
if ( buff[len-1] == '\n' )
len --;
Write(writefd, buff, len);
while( (n=Read(readfd, buff, MAXLINE)) >0 )
Write(STDOUT_FILENO, buff, n);
}
void Server(int readfd, int writefd)
{
int fd;
ssize_t n;
char buff[MAXLINE+1];
if ( (n = Read(readfd, buff, MAXLINE)) == 0 )
err_quit("end-of-file while reading pathname");
buff[n] = '\0';
printf("%s\n", buff);
if ( (fd = open(buff, O_RDONLY)) < 0 )
{
snprintf(buff+n, sizeof(buff)-n, ":can't open, %s\n", strerror(errno));
n = strlen(buff);
Write(writefd, buff, n);
}else
{
while( (n = Read(fd, buff, MAXLINE)) > 0)
Write(writefd, buff, n);
Close(fd);
}
}
int main(int argc, char **argv)
{
int pipe1[2], pipe2[2];
pid_t childpid;
Pipe(pipe1);
Pipe(pipe2);
if ( (childpid = Fork()) == 0 )
{
Close(pipe1[1]);
Close(pipe2[0]);
Server(pipe1[0], pipe2[1]);
exit(0);
}
Close(pipe1[0]);
Close(pipe2[1]);
Client(pipe2[0], pipe1[1]);
Waitpid(childpid, NULL, 0);
exit(0);
}
进程间通信 管道pipe
最新推荐文章于 2023-04-16 23:46:31 发布