2023年操作系统实验报告实验五.docx
实验五:管道通信实验内容:1 .阅读以下程序:# i nc 1 u de <unis t d.h># inc 1 ud e < s tdio. h ># i n c I ude < s tdlib.h>m a i n()(i n t f i led e s2;c har buff e r 80;i f (pip e (filed e s)<0)/ /建立管道,filedes0为管道里的读取端,filed es 1则为管道的写入端/成功则返回零,否则返回1,错误因素存于errn o中err_ q u i t(/zpipe e r r or");1 f (fo rk() >0)ch a r s = M h ell o !n”;c 1 ose(fil e d e s 0); / / 关闭 filede s 0文献w r ite(file d esl,s,s i zeo f (s): s 所指的内存写入到 f i 1 e d es 1文献内clo s e (filedes 1);/ / 关闭 filede s 文献el s eclo s e (filedesl);r e ad( f i Ie des 0,b u ffec80); / / 把 f i ledes 文献传送 80 个字节到buf f e r 缓冲区内 p r intf ("%s”, b uf f e r); cl o se(fi 1 e d e s 0);编译并运营程序,分析程序执行过程和结果,注释程序重要语句。#include <unistd.h>#include <stdio.h>/Include <stdltb.h>main()(tnt ftledes2;char buffer80;if(ptpe(filedes)<0)/err_quit(,pipe errorw);printf("pipe error");if(fork()>0)char s = "hello!n";close(filedes0);write(filedesl,s,sizeof(s);close(filedesl);elseclose(ftledesl);read(filedesO,buffer,80);printf buffer);close(ftledes0);)userubuntu:-> vi 5-1.c userubuntu:-$ gcc 5-1.c -o 5-1 userubuntu:$ /5-lhello!userubuntu:-$ -/5-l hello!useubuntu:$ ,.阅读以下程序:# i n clude<sy s /ty p e s .h># i n c 1 ude<sys/s t a t. h ># in c I u d e <f c n tl. h>main () char b u ffer80;i nt f d;un 1 ink (FIFO);删除 FIFO 文献mkf i fo(FlF O, 0666); I3/FIF0 是管道名,06 6 6 是权限if( fork ()>0)char s = "he 1 lo! n ";f d = open (FIFO,O_WRON LY); / / 以只写方式打开文献 F 1 FOw r it e (fd, s /sizeof(s);/把字符数组s的内存写入sizeo f ( s )个字节到参数f d所指的文献内 close(fd);关闭该文献,dose ()会让数据写回磁盘,并释放该文献所占用的资源 e 1 s efd= open(FI F O, O_RDO N LY);read (fd,buffer,80);printf("%s,buffer);c 1 os e (fd);)编译并运营程序,分析程序执行过程和结果,注释程序重要语句。#tnclude<stdto.h>#tnclude<sys/types.h>#include<sys/stat.h>#tnclude<fcntl.h>main()char buffer80;int fd;unlink(M5-2M);mkfifo(H5-2H,0666);FIFO:5-2是管道名,0666是权限tf(fork()>0)char s = "hello!nM;fd = open (H5-2M,O_WRONLY);wrtte(fd,s,sizeof(s);close(fd);elsefd= open("5-2H,0_RD0NLY);read(fd,buffer,80);printf(H%sH,buffer);close(fd);)userubuntu:-$ gcc 5-2.c -o 5-2userubuntu:$ /52 hello!useubuntu:$ ,.阅读以下程序:#includ e <std i o. h >main()F I LE * fp;cha r b u ffer80;fp=popen(Mcat/etc/pass wd","r");/*调用fork。产生子进程,然后从子进程中调用/bin/sh -c来执行c at/e t c/p a s swd。 参数代表读取,popen ()会建立管道连到子进程的标准输出设备或标准输入设备, 然后返回一个文献指针。*/fgets( b u f f e r,si z eoffbu f fe r ), f p ); 从 f p 文献中读取 s i z e of( buffe r )-1个字符到buf f erp r i n t f ("%s”, b u ffer);pc 1 ose( f p );/ / 关闭文献 fp)编译并运营程序,分析程序执行过程和结果,注释程序重要语句。#include<stdio.h>main()(FILE * fp;char buffer80;fp=popen("cat /etc/passwdM,"r");fgets(buffer,stzeof(buffer),fp);printf("%s",buffer);pclose(fp);)