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\n",getpid());
 16     if(pipe(fds) != 0)
 17     {
 18         perror("Fail to pipe");
 19         return;
 20     }
 21     printf("fds = {%d,%d}\n",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\n",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 \n",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\n",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\n",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\n",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 }

猜你喜欢

转载自www.cnblogs.com/xiaochi/p/8990912.html
今日推荐