日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux编程练习 --进程间通信2--两个管道实现双向通信

發布時間:2023/12/10 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • /*pipe3.c*/??
  • #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??
  • /*函數x*/??
  • int?functionx(int?nx);??
  • /*函數y*/??
  • 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);??
  • ????/*創建子進程1*/??
  • ????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]);??
  • ????????/*從管道讀出x*/??
  • ????????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)??
  • ????{??
  • ????????/*創建子進程2*/??
  • ????????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]);??
  • ????????????/*從管道讀出x*/??
  • ????????????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--两个管道实现双向通信的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。