创建两个管道,每个方向一个。步骤如下:
1.创建管道1(fd1[0]和fd1[1])和管道2(fd2[0]和fd2[1]);
2.fork;
3.父进程关闭管道1的读出端(fd[0])
4.父进程关闭管道2的写入端(fd2[1])
5.子进程关闭管道1的写入端(fd1[1])
6.子进程关闭管道2的读出端(fd2[0])
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<string.h>
#include<errno.h>
#define MAXLINE 256
void client(int readfd,int writefd);
void server(int readfd,int writefd);
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);
}
void client(int readfd,int writefd)
{
size_t len;
ssize_t n;
char buff[MAXLINE];
fgets(buff,MAXLINE,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)
printf("end-of-file while reading pathname\n");
buff[n]='\0';
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);
}
}
程序运行结果: