天天看點

作業系統——實驗三(程序間通信)——3.3.4作業系統——實驗三(程序間通信)——3.3.4

作業系統——實驗三(程序間通信)——3.3.4

實驗目的

1、了解linux系統中程序通信的基本原理。

2、分析程序競争資源現象,學習解決程序互斥的方法。

3.3.4程序的管道通信(必做)

編制一段程式,實作程序的管道通信。使用系統調用pipe()建立一條管道先。兩個子程序p1和分别向管道各寫一句話:

Child1processissendingamessage!

Child2processissendingamessage!

而父程序則從管道中讀出來自于兩個子程序的資訊并顯示在螢幕上。

第一步

建立c檔案夾,在它下面建立hello.c檔案

mkdir c
           
vim test.c
           

第二步

寫入參考程式

程式

#include<unistd.h>
#include<stdio.h>
#include<signal.h>
int pid1,pid2;
main()
{
int fd[3];
char outpipe[100],inpipe[100];
pipe(fd);
while((pid1=fork())==-1);
if(pid1==0)
{
printf("p1\n");
lockf(fd[1],1,0);
sprintf(outpipe,"child1processissendingamessage!");
write(fd[1],outpipe,50);
sleep(1);
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
printf("p2\n");
lockf(fd[1],1,0);
sprintf(outpipe,"child2processissendingamessage!");
write(fd[1],outpipe,50);
sleep(1);
lockf(fd[1],0,0);
exit(0);
}
else
{
printf("parent\n");
wait(0);/*同步*/
read(fd[0],inpipe,50);/*從管道中讀長為50位元組的串*/
printf("%s\n",inpipe);
wait(0);
read(fd[0],inpipe,50);
printf("%s\n",inpipe);
exit(0);
}
}
}

                             
           

結果

作業系統——實驗三(程式間通信)——3.3.4作業系統——實驗三(程式間通信)——3.3.4

相關知識

無名管道( pipe ):管道是一種半雙工的通信方式,資料隻能單向流動,而且隻能在具有親緣關系的程序間使用。程序的親緣關系通常是指父子程序關系。

有名管道(namedpipe):有名管道也是半雙工的通信方式,但是它允許無親緣關系程序間的通信。

管道通信的特點:管道隻能承載無格式位元組流。

觀察程式中的sleep(1)起什麼作用?

答:延長子程序占用管道的時間,并沒有讓子程序1先輸出而子程序2後輸出的作用。

子程序1和2為什麼也能對管道進行操作?

答:因為該pipe管道屬于無名管道,調用pipe()的父程序及其子孫程序均能識别此檔案描述符,能利用該檔案(管道)進行通信。

(摘自實驗報告書)

繼續閱讀