#include "sys/types.h" #include "sys/file.h" #include "unistd.h" char r_buf[4]; //读缓冲 char w_buf[4]; //写缓冲 int pipe_fd[2]; pid_t pid1, pid2, pid3, pid4; int producer(int id); int consumer(int id); int main(int argc,char **argv){ if(pipe(pipe_fd)<0){//传输出错 printf("pipe create error \n"); exit(-1); } else{ printf("pipe is created successfully!\n"); //谁占用管道谁进行数据传输 if((pid1=fork())==0) producer(1); if((pid2=fork())==0) producer(2); if((pid3=fork())==0) consumer(1); if((pid4=fork())==0) consumer(2); } close(pipe_fd[0]); //需要加上这两句 close(pipe_fd[1]); //否者会有读者或者写者永远等待 int i,pid,status; for(i=0;i<4;i++) pid=wait(&status); //返回子进程状态 exit(0); } //生产者 int producer(int id){ printf("producer %d is running!\n",id); close(pipe_fd[0]); int i=0; for(i=1;i<10;i++){ sleep(3); if(id==1) //生产者1 strcpy(w_buf,"aaa\0"); else //生产者2 strcpy(w_buf,"bbb\0"); if(write(pipe_fd[1],w_buf,4)==-1) printf("write to pipe error\n"); } close(pipe_fd[1]); printf("producer %d is over!\n",id); exit(id); } //消费者 int consumer(int id){ close(pipe_fd[1]); printf(" producer %d is running!\n",id); if (id==1) //消费者1 strcpy(w_buf,"ccc\0"); else //消费者2 strcpy(w_buf,"ddd\0"); while(1){ sleep(1); strcpy(r_buf,"eee\0"); if(read(pipe_fd[0],r_buf,4)==0) break; printf("consumer %d get %s, while the w_buf is %s\n",id,r_buf,w_buf); } close(pipe_fd[0]); printf("consumer %d is over!\n", id); exit(id); }
时间: 2023-07-15 20:10:50 浏览: 70
poll()函数详解.docx
这段代码实现了一个生产者-消费者模型,使用了管道进行进程间通信。具体流程如下:
1. 创建管道
使用pipe函数创建一个管道,返回两个文件描述符,分别代表管道的读和写端。
2. 创建进程
使用fork函数创建4个子进程,其中2个子进程作为生产者,另外2个子进程作为消费者。
3. 生产者进程
生产者进程通过管道的写端向管道中写入数据。每个生产者进程循环10次,每次向管道中写入一个字符串"aaa"或"bbb",并休眠3秒。
4. 消费者进程
消费者进程通过管道的读端从管道中读取数据。每个消费者进程循环读取管道中的数据,并打印出来。同时,每个消费者进程会向管道写入一个字符串"ccc"或"ddd",用于测试管道是否可靠地传输数据。
5. 关闭文件描述符
在主进程中,需要关闭管道的读和写端文件描述符,否则会有读者或者写者永远等待。
6. 等待子进程结束
使用wait函数等待所有子进程结束,然后退出程序。
阅读全文