作業系統——實驗三(程序間通信)——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);
}
}
}
結果

相關知識
無名管道( pipe ):管道是一種半雙工的通信方式,資料隻能單向流動,而且隻能在具有親緣關系的程序間使用。程序的親緣關系通常是指父子程序關系。
有名管道(namedpipe):有名管道也是半雙工的通信方式,但是它允許無親緣關系程序間的通信。
管道通信的特點:管道隻能承載無格式位元組流。
觀察程式中的sleep(1)起什麼作用?
答:延長子程序占用管道的時間,并沒有讓子程序1先輸出而子程序2後輸出的作用。
子程序1和2為什麼也能對管道進行操作?
答:因為該pipe管道屬于無名管道,調用pipe()的父程序及其子孫程序均能識别此檔案描述符,能利用該檔案(管道)進行通信。
(摘自實驗報告書)