OS实验七:进程互斥实验

实验目的

1、进一步认识并发执行的实质

2、分析进程竞争资源的现象,学习解决进程互斥的方法  

实验内容

1、编写程序,通过lockf函数实现进程之间对to_be_locked.txt文件的互斥访问

2、观察并分析出现的现象

实验过程

一、所涉及的系统调用

lockf(files,function,size)

用作锁定文件的某些段或者整个文件。

本函数的头文件为

#include "unistd.h"

参数定义:

int  lockf(files,function,size)

int  files,function;

long  size;

其中:files是文件描述符;function是锁定和解锁:1表示锁定,0表示解锁。size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾。

二、程序流程图

三、参考程序

#include<stdio.h>
#include<unistd.h>
main()
{
int p1,p2,i;
FILE *fp;
fp = fopen("to_be_locked.txt" ,"w+");
if(fp==NULL)
  {
    printf("Fail to create file");
    exit(-1);
   }
 while((p1=fork( ))== -1);       /*创建子进程p1*/
if (p1==0)
{
lockf(*fp,1,0);              /*加锁*/
for(i=0;i<10;i++)
  fprintf(fp,"daughter %d\n",i);
  lockf(*fp,0,0);              /*解锁*/
}
else
{
  while((p2=fork( ))==-1);  /*创建子进程p2*/
if (p2==0)
{
lockf(*fp,1,0);        /*加锁*/
for(i=0;i<10;i++)
fprintf(fp,"son %d\n",i);
lockf(*fp,0,0);        /*解锁*/
}
else
    {
      wait(NULL);
      lockf(*fp,1,0);         /*加锁*/
      for(i=0;i<10;i++)
      fprintf(fp,"parent %d\n",i);
      lockf(*fp,0,0);         /*解锁*/
   }
}
fclose(fp);
}

四、运行程序,查看结果

$ gcc  testlockf.c  –o  testlockf

$ . / testlockf

$ cat  to_be_locked.txt

to_be_locked.txt内容如下:

五、分析原因

在本程序中,不同进程之间存在共享临界资源:to_be_locked.txt文件。为了实现不同进程对文件的互斥访问,必须在对文件进行存取之前执行一个进入区;在对文件进行存取之后执行一个退出区。

在本程序中,利用了系统调用lockf(files,function,size)来实现了不同进程对文件的互斥存取。

猜你喜欢

转载自blog.csdn.net/qq_50777680/article/details/121265633