운영 체제 실험 2 프로세스 파이프 통신 실험

9819 단어 운영 체제
운영체제의 두 번째 실험은 프로세스와 라인 간의 통신에 관한 것이다.우리가 실험한 예는 바로 라인으로 통신하는 것이다. 라인 간 통신은 매우 간단하다. 그들은 모두 같은 자원을 가지고 있다.그리고 대학교 1학년 때 자바 라인으로 다대다담을 실현하는 것도 간단합니다.프로세스 간의 통신은 반드시 메시지 전달이나 공유 메모리를 통해 이루어져야 한다.이 실험은 프로세스 간의 정보 전달을 실현하기 위해 무명 파이프를 사용한 것이다.
실험 제목:
이원 함수 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)
f(x, y)/f(y)/f(y)/f(x)를 각각 완성하는 3개의 협동 프로세스를 프로그래밍해 주십시오.
 
실험 사고방식: 무명 파이프를 이용하여 통신한다. 세 가지 프로세스 때문에 먼저 fxy, fx, fy라고 부른다. fx는 fxy와 통신하고 한 파이프를 사용하며 fy도 fxy와 통신하고 다른 파이프를 사용한다.그 외에 다른 통신은 필요 없다.그래서 두 개의 파이프가 충분해요. 실험을 할 때 주변에 많은 학생들이 첫 번째 반응이 세 개의 파이프인데 이것은 사실상 좀 낭비예요.
 
실험 코드 및 설명:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int pid,pid2;//   
    int pipe1[2]; //           
    int pipe2[2]; //           
    int fx,fy,fxy;
    int x,y;
    //      
    printf("Please input x and y
"); scanf("%d %d",&x,&y); // pipe() 。 , if(pipe(pipe1) < 0){ perror("pipe1 create failed"); exit(EXIT_FAILURE); } if(pipe(pipe2) < 0){ perror("pipe2 create failed"); exit(EXIT_FAILURE); } // fork() , if((pid=fork()) <0){ perror("process1 create failed"); exit(EXIT_FAILURE); } else if(pid == 0){ // 1 1 close(pipe1[0]); // fx fx = Fx(x); printf("child pid is %d fx=%d (x=%d)
",getpid(),fx,x); write(pipe1[1],&fx,sizeof(int)); // , close(pipe1[1]); // exit(EXIT_SUCCESS); }else{ // // if((pid2=fork()) <0){ perror("process2 create failed."); exit(EXIT_FAILURE); }else if (pid2 == 0){ // 2 1 close(pipe2[0]); fy = Fy(y); printf("child pid is %d fy=%d (y=%d)
",getpid(),fy,y); write(pipe2[1],&fy,sizeof(int)); close(pipe2[1]); // exit(EXIT_SUCCESS); } // 1 0 , 2 0 close(pipe1[1]); close(pipe2[1]); read(pipe1[0],&fx,sizeof(int)); read(pipe2[0],&fy,sizeof(int)); fxy = fx + fy; printf("parent pid is %d fxy=%d (x=%d,y=%d)
",getpid(),fxy,x,y); close(pipe1[0]); close(pipe2[0]); } // return EXIT_SUCCESS; } // (xy) int Fxy(const int fx,const int fy){ return fx+fy; } // f(y) int Fy(const int y){ return y==1||y==2 ? 1:(Fy(y-1)+Fy(y-2)); } // f(x) int Fx(const int x){ return x==1? 1:Fx(x-1)*x; }

좋은 웹페이지 즐겨찾기