注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

一个由管道模拟的C-S例子  

2014-12-31 19:58:08|  分类: UNIX网络编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
void client(int ,int);
void server(int ,int);
#define MAXLINE 256

int main()
{/*main函数创建两个管道,一个读取client输入的路径,一个从server读出数据;client作为父进程运行,server作为子进程运行*/
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);
/*这里用waitpid来终止子进程。由于子进程在exit终止之后,成为僵死进程,但是父进程仍然运行着,子进程终止时会给父进程发送一个SIGCHLD的信号,系统对该信号默认是忽略的,所以用waitpid显式回收子进程资源。如果不用waitpid也没关系,系统内核会在init进程回收子进程资源*/
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--;
/*buff内容写入管道pipe1中*/
write(writefd,buff,len);
/*client随后读出由server写入管道的内容,并写到标准输出*/
while((n=read(readfd,buff,MAXLINE))>0)
write(STDOUT_FILENO,buff,n);
}
void server(int readfd,int writefd)
{
int fd;
ssize_t n;
char buf[MAXLINE];
/*从client中读出路径名,作为一个字符串处理*/
if((n=read(readfd,buf,MAXLINE))==0)
printf("end of file while reading\n");
buf[n]='\0';
/*错误处理*/
if((fd=open(buf,O_RDONLY))<0)
{
snprintf(buf+n,sizeof(buf)-n,"cannot open %s\n",strerror(errno));
n=strlen(buf);
write(writefd,buf,n);
}
else
{/*读取成功,则把内容写入到管道pipe2中*/
while((n=read(fd,buf,MAXLINE))>0)
write(writefd,buf,n);
close(fd);/*最后别忘记关闭文件描述符*/
}
}
管道中的数据其实是保存在内核的缓冲区的,尽管我们创建了管道文件,但是管道文件的大小一直是0,一旦程序运行了,就算删除管道文件,也不会影响程序的执行的。


  评论这张
 
阅读(222)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017