[关闭]
@Yori 2014-11-07T11:47:16.000000Z 字数 1718 阅读 3131

操作系统实验三 学习笔记

操作系统


引用自:
原文地址


实验内容

编写程序实现进程的管道通信。用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。

实验原理

1. 管道

所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。

2. 函数

fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

  1. 例子:
  2. #include<stdio.h>
  3. #Include<sys/types.h>
  4. #include<unistd.h>
  5. /*fork系统调用的一个简单例子*/
  6. void main(void) {
  7. printf(“Hello \n”);
  8. fork();
  9. printf(“Bye \n”);
  10. }
  11. 输出结果:Hello Bye Bye

3. 管道

管道是一条在进程间以字节流方式传送的通信通道。它由OS核心的缓冲区(通常几十KB)来实现,是单向的,是一个先进先出(FIFO)的队列,由一个进程写,一个进程读;

在使用管道前要建立相应的管道,然后才可使用。创建一个管道后,它的大小是固定的字节数。


实验源码

  1. #include <unistd.h>
  2. #include <signal.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. int pid1,pid2;
  7. main( )
  8. {
  9. int fd[2];
  10. char outpipe[100],inpipe[100];
  11. pipe(fd); /*创建一个管道*/
  12. while ((pid1=fork( ))==-1);
  13. /*lockf()函数允许将文件区域用作信号量(监视锁),或用于控制对锁定进程的访问(强制模式记录锁定)。
  14. 试图访问已锁定资源的其他进程将返回错误或进入休眠状态,直到资源解除锁定为止。
  15. 当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。当进程终止时,将释放进程保留的所有锁定。*/
  16. if(pid1==0)
  17. {
  18. lockf(fd[1],1,0);
  19. sprintf(outpipe,"child 1 process is sending message!");
  20. /*把串放入数组outpipe中*/
  21. write(fd[1],outpipe,50); /*向管道写长为50字节的串*/
  22. sleep(5); /*自我阻塞5秒*/
  23. lockf(fd[1],0,0);
  24. exit(0);
  25. }
  26. else
  27. {
  28. while((pid2=fork( ))==-1);
  29. if(pid2==0)
  30. {
  31. lockf(fd[1],1,0); /*互斥*/
  32. sprintf(outpipe,"child 2 process is sending message!");
  33. write(fd[1],outpipe,50);
  34. sleep(5);
  35. lockf(fd[1],0,0);
  36. exit(0);
  37. }
  38. else
  39. {
  40. wait(0); /*同步*/
  41. read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/
  42. printf("%s\n",inpipe);
  43. wait(0);
  44. read(fd[0],inpipe,50);
  45. printf("%s\n",inpipe);
  46. exit(0);
  47. }
  48. }
  49. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注