例1. 用命名管道实现文件拷贝
如图:我用命名管道tp 实现了将文件abc 中内容拷贝至abc.bak中,具体实现过程我在上篇博客中详细说明了,这里我不赘述,只显示代码实现过程。
上篇博客:进程间通信——管道详解
完整代码
- fifo1.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)
int main()
{
mkfifo("tp",0644); //创建管道
int infd,outfd;
infd=open("abc",O_RDONLY);
if(infd==-1) ERR_EXIT("open");
outfd=open("tp",O_WRONLY);
if(outfd==-1) ERR_EXIT("open");
char buf[1024];
int n;
while((n=read(infd,buf,1024))>0)
write(outfd,buf,n);
close(infd);
close(outfd);
return 0;
}
- fifo2.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)
int main()
{
int infd, outfd;
outfd=open("abc.bak",O_WRONLY|O_CREAT);
if(outfd==-1) ERR_EXIT("open");
infd=open("tp",O_RDONLY);
if(infd==-1) ERR_EXIT("open");
char buf[1024];
int n;
while((n=read(infd,buf,1024))>0)
write(outfd,buf,n);
close(infd);
close(outfd);
unlink("tp");
return 0;
}
- Makefile
.PHONY:all
all:fifo1 fifo2
fifo1:fifo1.c
gcc -o $@ $^
fifo2:fifo2.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f fifo1 fifo2
例2. 用命名管道实现client和server的通信
实现过程主要是通过创建命名管道 myfifo,然后由客户端向管道中写内容,服务器从管道中读内容实现通信。
如图:
完整代码展示:
- server.c
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define ERR_EXIT(m)\
do{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)
int main()
{
umask(0);
if(mkfifo("myfifo",0644)<0) //创建管道
ERR_EXIT("mkfifo\n");
int rfd=open("myfifo",O_RDONLY); //只读方式打开管道
if(rfd<0)
ERR_EXIT("open\n");
char buf[1024];
while(1)
{
buf[0]=0;
printf("Please wait...\n");
ssize_t s=read(rfd,buf,sizeof(buf)-1);
if(s>0) //读取成功
{
buf[s-1]=0; //忽略客户端最后输入的回车
printf("client say#:%s\n",buf);
}
else if(s==0) //所读文件已经关闭
{
printf("client quit,exit now!\n");
exit(EXIT_SUCCESS);
}
else //读取文件失败
ERR_EXIT("read error\n");
}
close(rfd);
return 0;
}
- client.c
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define ERR_EXIT(m)\
do{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)
int main()
{
umask(0);
int wfd=open("myfifo",O_WRONLY); //只写方式打开管道
if(wfd<0)
ERR_EXIT("open\n");
char buf[1024];
while(1)
{
buf[0]=0;
printf("Please Enter#:");
fflush(stdout);
ssize_t s=read(0,buf,sizeof(buf)-1);
if(s>0) //读取成功
{
buf[s]=0; //给字符串最后补充 \0
write(wfd,buf,strlen(buf));
}
else //读取文件失败
ERR_EXIT("read error\n");
}
close(wfd);
return 0;
}
- Makefile
.PHONY:all
all:client server
client:client.c
gcc -o $@ $^
server:server.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f client server
多多支持博主哦~