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 }