计算机操作系统_进程间互斥与同步
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程间互斥与同步
实验内容:
编写算法,实现进程间对临界资源的互斥访问以及进程间的同步关系。
实验要求:
1、要求进程互斥使用文本文件;
2、假定文本文件txt1最大可写入30个字符;
3、写满后复制进程将文本文件的内容复制到另一个文本文件txt2中(无长度限制)。
4、复制进程复制完毕写入进程可再重新写入,重复执行3,4,直到给出停止命令。
5、实现进程间的同步和互斥。
代码:
#include
#include
#include
#include
#include
#include
using namespace std;
typedef union _semnu{
int val;
struct semid_ds *buf;
ushort *array;
}semun;
//v操作
void v(int &sem_id)
{
struct sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_op=1;
sem_b.sem_flg=SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1)
{
cout<<"error"< exit(0); } } //p操作 void p(int &sem_id) { struct sembuf sem_b; sem_b.sem_num=0; sem_b.sem_op=-1; sem_b.sem_flg=SEM_UNDO; if(semop(sem_id,&sem_b,1)==-1) { cout<<"error"< exit(0); } } //设置信号量初值 void set(int sem_id,int val=1) { semun sem_un; sem_un.val=val; if(semctl(sem_id,0,SETVAL,sem_un)==-1) { if(errno==EEXIST) cout<<"exist"< cout<<"set"< exit(0); } } void del(int sem_id) { semun sem_un; if(semctl(sem_id,0,IPC_RMID,sem_un)==-1) cout<<"error"< } int main() { //互斥量 int sem_mutex=semget((key_t)8888,1,IPC_CREAT); set(sem_mutexk,1); int sem_full=semget((key_t)1234,1,IPC_CREAT); cout< //set semaphore full set(sem_full,0); int sem_empty=semget((key_t)1235,1,IPC_CREAT); cout< //set semaphore emtpy set(sem_empty,1); FILE *fp1=fopen("./txt1","w"); FILE *fp2=fopen("./txt1","r"); FILE *fp3=fopen("./txt2","w"); pid_t id=fork(); if(id>0)//parent { //produce //p(empty) // //v(full) for(int i=0;i<5;i++) { p(sem_empty); p(sem_mutex);//锁定临界区 cout<<"writing... "< fseek(fp1,0,SEEK_SET); fputs("QWERTYUIOPASDFGHJKLZXCVBNM1234",fp1); fflush(fp1); sleep(1); cout<<"write done"< v(sem_mutex); v(sem_full); } fclose(fp1); cout<<"txt2:"< system("cat txt2 \n"); }else if(id==0) { //consume //p(full) // //v(empty) char buf[32]; buf[31]='\0'; fill(buf,buf+20,0); for(int i=0;i<5;i++) { p(sem_full); p(sem_mutex);//锁定临界区 cout<<"reading... "< fseek(fp2,0,SEEK_SET); fgets(buf,30,fp2); fputs(buf,fp3); fflush(fp3); //由于缓冲方式的影响,30个字符不会立刻读取到buf 中,需要fflush cout< cout<<"read done"< cout< sleep(1); v(sem_mutex); v(sem_empty); } fclose(fp2); fclose(fp3); exit(0); }else//error { cout<<"创建子进程失败!"< exit(0); } // del(sem_full); // del(sem_empty); return0; } 输出结果: //注意要以root用户运行程序 196608 229377 writing 0 write done reading 0 QWERTYUIOPASDFGHJKLZXCVBNM123