生活随笔
收集整理的這篇文章主要介紹了
Linux编程练习 --进程间通信2--两个管道实现双向通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用兩個管道進行進程間雙向通信在第一篇練習已經大致作出說明,下面將進行一個更為綜合的練習
首先看題目:
設有二元函數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)
請編程建立3 個并發協作進程,它們分別完成f(x,y)、f(x)、f(y)
實現的方法很多,這里只用管道實現,大致流程如下:
1.在父進程代碼中初始化四個管道,兩個用于父-子進程1,另外兩個父-子進程2;
2.父進程創建2個子進程,子進程1計算函數f(x),子進程2計算函數f(y);
3.父進程向子進程1、2發送數據;
4.子進程1、2均在管道里讀出數據,并進行計算;
5.計算完畢后,子進程1、2向父進程發送結果;
6。父進程接受數據,打印出來
?
下面是實現過程:
[cpp]?view plaincopy
?? #include?<unistd.h>?? #include?<sys/stat.h>?? #include?<sys/types.h>?? #include?<stdio.h>?? #include?<fcntl.h>?? #define?MAXLINE?1024?? #define?READ????0?? #define?WRITE???1?? ?? int?functionx(int?nx);?? ?? int?functiony(int?ny);?? main(void)?? {?? ????pid_t?pid_x,pid_y;?? ????int?fdx1[2],fdy1[2],fdx2[2],fdy2[2];?? ?????? ????pipe(fdx1);?? ????pipe(fdy1);?? ????pipe(fdx2);?? ????pipe(fdy2);?? ?????? ????pid_x?=?fork();?? ????if(pid_x?<?0)?? ????{?? ????????printf("Create?process?error!/n");?? ????????exit(0);?? ????}?? ????if(pid_x?==?0)?? ????{?? ????????int?numx,funx;?? ????????printf("childx?process?ID:%d/n",getpid());?? ????????close(fdx1[WRITE]);?? ????????close(fdx2[READ]);?? ?????????? ????????read(fdx1[READ],&numx,sizeof(int));?? ?????????? ????????funx?=?functionx(numx);?? ????????printf("childx??x=%d/n",funx);?? ?????????? ????????write(fdx2[WRITE],&funx,sizeof(int));?? ????????close(fdx1[READ]);?? ????????close(fdx2[WRITE]);?? ????}?? ????if(pid_x?>?0)?? ????{?? ?????????? ????????pid_y?=fork();?? ????????if(pid_y?<?0)?? ????????{?? ????????????printf("Create?process?error!/n");?? ????????????exit(0);?? ????????}?? ????????if(pid_y?==?0)?? ????????{?? ????????????int?numy,funy;?? ????????????printf("childy?process?ID:%d/n",getpid());?? ????????????close(fdy1[WRITE]);?? ????????????close(fdy2[READ]);?? ?????????????? ????????????read(fdy1[READ],&numy,sizeof(int));?? ?????????????? ????????????funy?=?functiony(numy);?? ????????????printf("childy??y=%d/n",funy);?? ?????????????? ????????????write(fdy2[WRITE],&funy,sizeof(int));?? ????????}?? ????????if(pid_y?>?0)?? ????????{????? ????????????int?x,y,funxy;?? ????????????int?fx,fy;?? ????????????sleep(1);?? ????????????printf("parentxy?process?ID:%d/n%",getpid());?? ?????????????? ????????????printf("enter?x,y/n");?? ????????????scanf("%d,%d",&x,&y);?? ????????????close(fdx2[WRITE]);?? ????????????close(fdx1[READ]);?? ????????????close(fdy2[WRITE]);?? ????????????close(fdy1[READ]);?? ?????????????? ????????????write(fdx1[WRITE],&x,sizeof(int));?? ????????????write(fdy1[WRITE],&y,sizeof(int));?? ?????????????? ????????????sleep(1);?? ?????????????? ????????????read(fdx2[READ],&fx,sizeof(int));?? ????????????read(fdy2[READ],&fy,sizeof(int));?? ????????????funxy?=?fx+fy;?? ????????????printf("f(x)?=?%d/nf(y)?=?%d/nfun(x,y)?=?%d",fx,fy,funxy);?? ????????????waitpid(pid_x,NULL,0);?? ????????????waitpid(pid_y,NULL,0);?? ????????}?? ????}????? }?? int?functionx(int?nx)?? {?? ????int?sum?=?1;?? ????int?i?=?1;?? ????if(nx?<?0)?? ????{?? ????????printf("errorx!/n");?? ????????exit(0);?? ????}?? ????while(i?<=?nx)?? ????{?? ????????sum?*=i++;?? ????}?? ????return?sum;?? }?? int?functiony(int?ny)?? {?? ????int?f1=1,f2=1,f3;?? ????int?i?=3;?? ????if(ny?<=?2)?? ????????return?f1;?? ????while(i?<=?ny)?? ????{?? ????????f3?=?f1+f2;?? ????????f1?=?f2;?? ????????f2?=?f3;?? ????????i++;?? ????}?? ????return?f3;?? }??
?
編譯:
$ gcc pipe3.c -o pipe3
運行:
$ ./pipe
?
我們輸入測試數據x=3,y=4
輸出為f(x)=6,f(y)=3,f(x,y)=9
成功
總結
以上是生活随笔為你收集整理的Linux编程练习 --进程间通信2--两个管道实现双向通信的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。