UNIX:在父子进程间用管道技术通信

    《Unix网络编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。

    PS:程序里使用了包裹函数(首字母是大写的函数)和常量(所有字母都是大写的常量)的声明在my_unp.h文件中,定义在unp_base.c和unp_thread.c中,地址:http://blog.csdn.net/aaa20090987/article/details/8096701

 程序简介:这个程序演示了父子进程之间如果利用管道技术进行通信。


上代码:

  1. #include "my_unp.h"  
  2.   
  3. void client(int readfd, int writefd)  
  4. {  
  5.     size_t len;  
  6.     ssize_t n;  
  7.     char buff[MAXLINE];  
  8.   
  9.     //从终端读入一行数据(文件路径)  
  10.     Fgets(buff, MAXLINE, stdin);  
  11.     len = strlen(buff);  
  12.     if'\n' == buff[len-1] )  
  13.         len--;  
  14.     //将其写入管道  
  15.     Write(writefd, buff, len);  
  16.     //然后从管道中读出数据  
  17.     while( (n=Read(readfd, buff, MAXLINE)) > 0 )  
  18.         Write(STDOUT_FILENO, buff, n);  
  19. }  
  20.   
  21. void server(int readfd, int writefd)  
  22. {  
  23.     int fd;  
  24.     ssize_t n;  
  25.     char buff[MAXLINE];  
  26.   
  27.     //从管道中读出一行数据(文件路经)  
  28.     if( (n=Read(readfd, buff, MAXLINE)) == 0 )  
  29.         error_quit("end of file while reading pathname");  
  30.     buff[n] = '\0';  
  31.   
  32.     //打开文件  
  33.     fd = open(buff, O_RDONLY);  
  34.     //如果打开失败,就将失败原因写入管道  
  35.     if( fd < 0 )  
  36.     {  
  37.         snprintf(buff+n, sizeof(buff)-n, ": can't open, %s\n",  
  38.             strerror(errno));  
  39.         n = strlen(buff);  
  40.         Write(writefd, buff, n);  
  41.     }  
  42.     //否则,将文件内容写入管道  
  43.     else  
  44.     {  
  45.         while( (n=Read(fd, buff, MAXLINE)) > 0 )  
  46.             Write(writefd, buff, n);  
  47.         Close(fd);  
  48.     }  
  49. }  
  50.   
  51. int main(int argc, char **argv)  
  52. {  
  53.     int pipe1[2], pipe2[2];  
  54.     pid_t childpid;  
  55.   
  56.     Pipe(pipe1);  
  57.     pipe(pipe2);  
  58.     childpid = Fork();  
  59.   
  60.     //父子进程分别关闭自己不需要的管道端口  
  61.     if( childpid == 0 )  
  62.     {  
  63.         Close(pipe1[1]);  
  64.         Close(pipe2[0]);  
  65.         server(pipe1[0], pipe2[1]);  
  66.     }  
  67.     else  
  68.     {  
  69.         Close(pipe1[0]);  
  70.         Close(pipe2[1]);  
  71.         client(pipe2[0], pipe1[1]);  
  72.         //父进程必须等子进程退出之后才能退出  
  73.         Waitpid(childpid, NULL, 0);  
  74.     }  
  75.     return 0;  
  76. }  

运行示例(红色字体的为输入)

qch@ubuntu:~/code$gcc my_unp.c temp.c -o temp
#打开一个有两行字符串的文本文件
qch@ubuntu:~/code$./temp
text.txt
I'amChinese.
Hello,world.
#打开一个我们不能读的文件
qch@ubuntu:~/code$./temp
/etc/shadow
/etc/shadow:can't open, Permission denied
#打开一个不存在的文件
qch@ubuntu:~/code$ ./temp
aaaaa
aaaaa:can't open, No such file or directory

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值