无名管道
UNIX网络编程:进程间的通信
手写之管道篇
代码
myhead.h
#ifndef MYHEAD_H_
#define MYHEAD_H_
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#define MAXLINE 4096
#endif
mypipe.c
#include"myhead.h"
void server(int, int), client(int, int);
int main()
{
pid_t child = 0;
int pipe1[2], pipe2[2];
pipe(pipe1);
pipe(pipe2);
if((child = fork()) == 0)
{
close(pipe1[1]);
close(pipe2[0]);
client(pipe1[0], pipe2[1]);
exit(0);
}
close(pipe1[0]);
close(pipe2[1]);
server(pipe2[0], pipe1[1]);
waitpid(child, NULL, 0);
exit(0);
}
void client(int readfd, int writefd)
{
char buff[MAXLINE] = {0};
ssize_t len = 0; //千万别写成无符号的int size_t等类型,或导致隐式转换-1变成INT_MAX > 0,导致循环无法结束
int flags = 0;
fgets(buff, MAXLINE, stdin);
len = strlen(buff);
if(buff[len - 1] == '\n')
len--;
write(writefd, buff, len);
#if 1
//改变readfd为非阻塞读,使程序可以自行结束
flags = fcntl(readfd, F_GETFL, 0);
if(flags < 0)
{
perror("fcntl");
}
flags |= O_NONBLOCK;
fcntl(readfd, F_SETFL, flags);
#endif
sleep(1);
#if 0
//当时len被申明为int,导致-1转换成INT_MAX 死循环,查了半天 read 返回的使ssize_t
while((len = read(readfd, buff, MAXLINE)) > 0)
{
printf("%s", buff);
memset(buff, 0, MAXLINE);
}
#endif
len = read(readfd, buff, MAXLINE);
while(len > 0)
{
printf("%s", buff);
len = read(readfd, buff, MAXLINE);
}
return;
}
void server(int readfd, int writefd)
{
char buff[MAXLINE] = {0};
int fd;
size_t len = 0;
read(readfd, buff, MAXLINE);
printf("read %s\n", buff);
fd = open(buff, O_RDONLY);
if(fd < 0)
{
printf("cannot open %s\n", buff);
return ;
}
while((len = read(fd, buff, MAXLINE)) > 0)
{
write(writefd, buff, MAXLINE);
}
printf("server close\n");
close(fd);
return;
}
编译后执行,输入当前文件夹下的某个文件即可得到输出。