OS-homework-6 下载本文

实验六

实验名称:

管道通信

实验报告:实验要求:

1. 阅读以下程序:

#include #include #include main() {

int filedes[2]; char buffer[80];

if(pipe(filedes)<0) //创建一个新管道

err_quit(“pipe error”); if(fork()>0){

char s[ ] = “hello!\\n”;

close(filedes[0]); //关闭读

write(filedes[1],s,sizeof(s)); //从父进程写入管道 close(filedes[1]); //在退出程序前关闭写 }else{

close(filedes[1]); //关闭写

read(filedes[0],buffer,80); //从管道读并且保存在buffer中 printf(“%s”,buffer); close(filedes[0]); } }

编译并运行程序,分析程序执行过程和结果,注释程序主要语句。

2. 阅读以下程序:

#include #include #include main() {

char buffer[80]; int fd;

unlink(FIFO); //(如果有FIFO文件,先删掉) mkfifo(FIFO,0666); //创建一个FIFO文件 if(fork()>0){

char s[ ] = “hello!\\n”;

fd = open (“FIFO”,O_WRONLY); //此处是文件名FIFO加上引号 write(fd,s,sizeof(s));

close(fd); }else{

fd= open(FIFO,O_RDONLY); read(fd,buffer,80); printf(“%s”,buffer); close(fd); } }

编译并运行程序,分析程序执行过程和结果,注释程序主要语句。

3. 阅读以下程序:

#include main() {

FILE * fp; char buffer[80];

fp=popen(“cat /etc/passwd”,”r”); //将cat /etc/passwd里的文件读取出来写入到fp中

fgets(buffer,sizeof(buffer),fp); //获取字符串并保存到buffer中 printf(“%s”,buffer); pclose(fp); }

编译并运行程序,分析程序执行过程和结果,注释程序主要语句。

4. 编写一个程序,读取一个数据文件,对每一个数据进行某种运算,再在屏幕输出计算结

果。要求以上工作用两个进程实现,父进程负责读文件和显示,子进程进行计算,进程间通信使用无名管道。(使用系统调用) #include #include #include #include #include int main() {

int filedes[2]; int data[10]; pid_t pid; if(pipe(filedes)<0)

{

perror(\ exit(1); }

if((pid = fork()) == -1) {

perror(\ exit(1); }

if(pid > 0) {

FILE* fpread;

if( (fpread = fopen(\ {

perror(\ exit(1); } int i = 0;

for(i = 0;i < 10; i++) {

fscanf(fpread,\ }

fclose(fpread);

close(filedes[0]);

write(filedes[1],data,sizeof(data)); close(filedes[1]);

wait(0);

close(filedes[1]); read(filedes[0],data,40); close(filedes[0]);

printf(\ for(i = 0; i < 10; i++) {

printf(\ } } else {

close(filedes[1]); read(filedes[0],data,40); close(filedes[0]); int i;

for(i = 0; i < 10; i++) {

data[i] = data[i] * data[i]; }

close(filedes[0]);

write(filedes[1],data,sizeof(data)); close(filedes[1]); } exit(0); }

5. 编写两个程序,一个创建一个FIFO,并读管道,并显示在屏幕上,另一个每过一段时

间向该管道写数据(进程PID)。运行多个写程序和一个读程序,观察运行结果。(使用系统调用) //5.c

#include #include #include #include #include #include int main() {

int pid; int fd;

unlink(\

mkfifo(\

fd= open(\Y);

sleep(3);

read(fd,&pid,sizeof(int));

printf(\ close(fd); } //5_plus.c #include #include #include #include #include #include int main() {

int pid,fd; exit(0);

pid = getpid();

fd = open (\Y); write(fd,&pid,sizeof(pid));

printf(\

close(fd); }

exit(0);