운영 체제 실험 2 프로세스 파이프 통신 실험
9819 단어 운영 체제
실험 제목:
이원 함수 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
독서 노트문제1: 한 파일에 10000000개의 기록이 포함되어 있으며, 각 기록의 내용은 7자리의 정수이다.기록은 중복되지 않는다.파일 내용을 읽는 프로그램이 필요하고, 이 기록을 정렬한 후 파일을 출력해야 하며, 메모리는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.