实验目的
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)来实现了不同进程对文件的互斥存取。