PIPE是Linux下可以用来实现进程间通信的一种手段,当我们调用pipe系统调用时,将会产生一对文件描述符,fd[0]可以用来读,fd[1]用来写,fd[1]写的数据将会在fd[0]中读到,我们称之为管道。进程之间可以依赖管道的方式实现进程间通信,pipe是半双工的,所以如果要实现pipe之间互相通信的话,需要建立2对pipe。下面我们演示用pipe实现父进程生产数字,子进程消费数字并排序的一个程序。
#include <iostream>
#include <unistd.h>
#include <vector>
#include <algorithm>
#include <sys/types.h>
#include <sys/wait.h>
#define END_FLAG (1 << (sizeof(int)*8 - 1))
using namespace std;
enum PIPE_FD_TYPE {
PIPE_READ = 0,
PIPE_WRITE
};
int main() {
int pipe_fd[2] = {-1, -1};
if(pipe(pipe_fd) != 0) {
exit(0);
}
int pid = -1;
if((pid = fork()) == -1) {
exit(0);
}
//child
if(pid == 0) {
cout<<"child start\n";
int data = -1;
vector<int> v;
while(read(pipe_fd[PIPE_READ], &data, sizeof(data)) > 0) {
if(data == END_FLAG) {
break;
}
v.push_back(data);
}
cout<<"size : "<<v.size()<<endl;
sort(v.begin(), v.end());
for(auto i : v) {
cout<<i<<" ";
}
cout<<endl;
cout<<"child end\n";
}
//parent
if(pid != 0) {
cout<<"parent start\n";
int v[] = {134, 123, 1111, -1, 0, 888, 7564, 976, 9876, 66, 99, 123, 189};
for(int i = 0; i < sizeof(v)/sizeof(v[0]); i++) {
write(pipe_fd[PIPE_WRITE], &v[i], sizeof(v[i]));
}
int end = END_FLAG;
write(pipe_fd[PIPE_WRITE], &end, sizeof(end));
int status = -1;
waitpid(-1, &status, 0);//等待子进程结束
cout<<"paranet end\n";
}
return 0;
}