zoukankan      html  css  js  c++  java
  • 14.管道模型

      1 #include <stdio.h>
      2 #include <unistd.h>
      3 #include <string.h>
      4 #include <stdlib.h>
      5 #include <ctype.h>
      6 #include <sys/fcntl.h>
      7 
      8 //读写管道进行进程间的通信
      9 //父进程写,子进程读
     10 void TestPipe()
     11 {
     12     //fds[0]读管道,fds[1]写管道
     13     int fds[2];
     14 
     15     printf("My pid %d
    ",getpid());
     16     if(pipe(fds) != 0)
     17     {
     18         perror("Fail to pipe");
     19         return;
     20     }
     21     printf("fds = {%d,%d}
    ",fds[0],fds[1]);
     22 
     23     pid_t pid = fork();
     24 
     25      char szBuf[100];
     26     //子进程
     27     if(pid == 0)
     28     {
     29 
     30         printf("Child pid %d
    ",getpid());
     31 
     32         //关闭写(原因是把引用计数减1,以防父进程不能释放fd[1])
     33         //因为子进程只进行读
     34         close(fds[1]);
     35 
     36         //
     37         while(1)
     38         {
     39             memset(szBuf,0,100);
     40             read(fds[0],szBuf,100);
     41             printf("Child receive: %s 
    ",szBuf);
     42         }
     43         close(fds[0]);
     44     }
     45     else
     46     {
     47         //关闭读
     48         close(fds[0]);
     49 
     50         while(1)
     51         {
     52             usleep(10000);
     53             fprintf(stderr,"Send:");
     54             //scanf("%s",szBuf);
     55             memset(szBuf,0,100);
     56             //0是标准输入
     57             read(0,szBuf,100);
     58             write(fds[1],szBuf,strlen(szBuf));
     59         }
     60         close(fds[1]);
     61     }
     62 }
     63 
     64 //管道双向通信
     65 void TestDblpPipe()
     66 {
     67     //父进程到子进程的管道
     68     int fdsa[2];
     69     //子进程到父进程的管道
     70     int fdsb[2];
     71 
     72     char szBuf[100];
     73 
     74     printf("My pid %d
    ",getpid());
     75 
     76     if(pipe(fdsa) || pipe(fdsb))
     77     {
     78         fprintf(stderr,"create error");
     79         return;
     80     }
     81 
     82     //创建子进程
     83     pid_t pid = fork();
     84 
     85     if(pid == 0)
     86     {
     87         close(fdsa[1]);
     88         close(fdsb[0]);
     89 
     90         printf("child pid %d
    ",getpid());
     91 
     92         while(1)
     93         {
     94             memset(szBuf,0,100);
     95 
     96             read(fdsa[0],szBuf,100);
     97             //转化成大写
     98             int i;
     99             for(i=0;i<strlen(szBuf);i++)
    100             {
    101                 szBuf[i] = toupper(szBuf[i]);
    102             }
    103 
    104             write(fdsb[1],szBuf,strlen(szBuf));
    105         }
    106         close(fdsa[0]);
    107         close(fdsb[1]);
    108     }
    109     else
    110     {
    111         //关闭父进程到子进程的管道的读
    112         close(fdsa[0]);
    113         //关闭子进程到父进程的管道的写
    114         close(fdsb[1]);
    115         while (1)
    116         {
    117             usleep(10000);
    118             fprintf(stderr,"Send:");
    119             memset(szBuf,0,100);
    120             read(0,szBuf,100);
    121 
    122             write(fdsa[1],szBuf,strlen(szBuf));
    123 
    124             read(fdsb[0],szBuf,100);
    125 
    126             printf("Upper:%s",szBuf);
    127 
    128         }
    129         close(fdsa[1]);
    130         close(fdsb[0]);
    131     }
    132 }
    133 
    134 void TestPopen()
    135 {
    136     int arr[] = {1,4,7,2,5,8,9,6,3};
    137 
    138     //创建子进程,并调用exec,指向cmd命令
    139     //同时建立管道,用于父子进程标准输入输出
    140     //r,数据由子进程到父进程
    141     //w,数据由父进程到子进程
    142     FILE *pFile = popen("sort -n","w");
    143 
    144     if(!pFile)
    145     {
    146         perror("popen filed");
    147         return;
    148     }
    149 
    150     int i;
    151     for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
    152     {
    153         fprintf(pFile,"%d
    ",arr[i]);
    154     }
    155 
    156     pclose(pFile);
    157 }
    158 
    159 int main()
    160 {
    161     //TestPipe();
    162     //TestDblpPipe();
    163     //TestDupForPipe();
    164     TestPopen();
    165     return 0;
    166 }
  • 相关阅读:
    表格行内编辑增删改查
    rpc远程调用开发
    gdb调试程序
    Makefile文件编写
    CentOS6.6源码编译升级GCC至4.8.2
    linux 下C语言编程库文件处理与Makefile编写
    laravel队列-让守护进程处理耗时任务
    回顾javase点滴
    服务端生成word并压缩打包下载
    pytest框架插件(用例依赖、多重校验、执行顺序、失败重跑、重复执行、标记)
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8990912.html
Copyright © 2011-2022 走看看