进程通信实验

    技术2022-05-20  38

    /** 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]);  }  


    最新回复(0)