⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_fork.c

📁 操作系统课程设计 有进程同步问题 内存管理 设备管理
💻 C
字号:
#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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -