📄 prg4_6.c
字号:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#define MAXLINE 100
#define FIFO1 "/tmp/fifo.1"
#define FIFO2 "/tmp/fifo.2"
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
void client(int ,int),server(int,int);
int main(int argc,char ** argv)
{
int readfd,writefd;
char serr[256] = {0};
pid_t childpid;
//创建两个命名管道
if ((mkfifo(FIFO1,FILE_MODE) < 0) && (errno != EEXIST))
{
sprintf(serr,"can't create %s",FIFO1);
perror(serr);
exit(0);
}
if ((mkfifo(FIFO2,FILE_MODE) < 0 )&& (errno != EEXIST))
{
unlink(FIFO1);
sprintf(serr,"can't create %s",FIFO2);
perror(serr);
exit(0);
}
if ((childpid = fork()) == 0) //子进程
{
readfd = open(FIFO1,O_RDONLY,0);
writefd = open(FIFO2,O_WRONLY,0);
server(readfd,writefd);
exit(0);
}
else if (childpid >0) //父进程
{
writefd = open(FIFO1,O_WRONLY,0);
readfd = open(FIFO2,O_RDONLY,0);
client(readfd,writefd);
waitpid(childpid,NULL,0);
close(readfd);
close(writefd);
unlink(FIFO1);
unlink(FIFO2);
exit(0);
}
else
{
printf("fork error\n");
exit(0);
}
}
void client(int readfd,int writefd)
{
size_t len;
size_t n;
char buff[MAXLINE];
//从命令行中读入一个路径到IPC管理
fgets(buff,MAXLINE,stdin);
len = strlen(buff);
if (buff[len-1] == '\n')
len-- ;
write(writefd,buff,len);
//read from IPC ,write to standard output
while( (n=read(readfd,buff,MAXLINE)) >0)
write(STDOUT_FILENO,buff,n);
}
void server(int readfd,int writefd)
{
int fd;
size_t n;
char buff[MAXLINE+1];
if ( ( n= read(readfd,buff,MAXLINE)) == 0)
{
perror("end-of-file while reading pathname");
exit(0);
}
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);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -