进程通信实验

来源:互联网 发布:mac软件免费下载平台 编辑:程序博客网 时间:2024/05/18 20:47

/*
* description
: ex2.c
* copyright
: (C) by ocean
* Function
: 利用管道实现f(x,y) = f(x) + f(y)
 其中: f(x) = f(x-1) * x (x >1)
 f(x)=1 (x=1)
 f(y) = f(y-1) + f(y-2) (y> 2)
 f(y)=1 (y=1,2)
*/
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <pthread.h>
 void task1(int *); //线程1执行函数原型
 void task2(int *); //线程2执行函数原型
 void task3(int *);//线程3执行函数原型

 int fx(int x){
  if(x==1) return 1;
  else return x*fx(x-1);
  }
 int fy(int y){
  if(y==1||y==2) return 1;
  else return fy(y-1)+fy(y-2);
  }

 int pipe1[2],pipe2[2],pipe3[2],pipe4[2];//存放两个无名管道标号
 pthread_t thrd1,thrd2,thrd3;//存放两个线程标识
 int main(int argc,char *arg[])
 {
  int ret;
  int num1,num2,num3;
  //使用pipe()系统调用建立3个无名管道。建立不成功程序退出,执行终止
  if(pipe(pipe1) < 0){
   perror("pipe not create");
   exit(EXIT_FAILURE);
  }
  if(pipe(pipe2) < 0){
   perror("pipe not create");
   exit(EXIT_FAILURE);
  }
  if(pipe(pipe3) < 0){
   perror("pipe not create");
   exit(EXIT_FAILURE);
  }
  if(pipe(pipe4) < 0){
   perror("pipe not create");
   exit(EXIT_FAILURE);
  }
  //使用pthread_create系统调用建立3个线程。建立不成功程序退出,执行终止
  num1 = 1 ;
  ret = pthread_create(&thrd1,NULL,(void *) task1,(void *) &num1);
  if(ret){
   perror("pthread_create: task1");
   exit(EXIT_FAILURE);
  }
  num2 = 2 ;
  ret = pthread_create(&thrd2,NULL,(void *) task2,(void *) &num2);
  if(ret){
   perror("pthread_create: task2");
   exit(EXIT_FAILURE);
  }
  num3 = 3 ;
  ret = pthread_create(&thrd3,NULL,(void *) task3,(void *) &num3);
  if(ret){
   perror("pthread_create: task3");
   exit(EXIT_FAILURE);
  }
  //挂起当前线程切换到thrd3线程
  pthread_join(thrd3,NULL);
  //挂起当前线程切换到thrd1线程
  pthread_join(thrd1,NULL);
  //挂起当前线程切换到thrd2线程
  pthread_join(thrd2,NULL);
  
  exit(EXIT_SUCCESS);
 }
  //线程1执行函数,它首先向管道写,然后从管道读
  void task1(int *num)
  {
   int a,x=1;
   int n=1;
   
   do{
   int xx = fx(x);
   write(pipe1[1],&xx,sizeof(int));
   printf("thread f(x) equals : %d   x=%d/n",xx,x);
   read(pipe3[0],&a,sizeof(int));
   x++;
   n++;
   }while(n<=9);
   //读写完成后,关闭管道
   close(pipe1[1]);
   close(pipe3[0]);
   
  }

  void task2(int * num)
  {
   int b,y=1;
   int n=1;
   do{
   int yy = fy(y); 
   write(pipe2[1],&yy,sizeof(int));
   printf("thread f(y) equals : %d   y=%d/n",yy,y);
   read(pipe4[0],&b,sizeof(int));
   y++;
      n++;
   }while( n<=9 );
   //读写完成后,关闭管道
   close(pipe4[0]);
   close(pipe2[1]);
  }
  void task3(int *num){
   int xx,yy;
   int n=1;
   int a =0,b=0;
    do{
   read(pipe1[0],&xx,sizeof(int));
   read(pipe2[0],&yy,sizeof(int));

   int xy = xx+yy;
   printf("thread f(x,y) equals: %d/n",xy);
   write(pipe3[1],&a,sizeof(int));
   write(pipe4[1],&b,sizeof(int));
   n++;
       }while(n<=9);
   //读写完成后,关闭管道
   close(pipe1[1]);
   close(pipe2[0]);
   close(pipe3[1]);
   close(pipe4[1]);
  }
  

原创粉丝点击