操作系统原理试验报告Word格式.docx
- 文档编号:17899304
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:11
- 大小:31.09KB
操作系统原理试验报告Word格式.docx
《操作系统原理试验报告Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统原理试验报告Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
三、内容
在LINUX系统内,编写一个程序,含有两个线程,设置两个信号灯并定义好P,V操作,利用两个信号灯实现两个线程的互斥。
最后利用gcc进行编译。
四、程序描述
源程序:
#include<
stdio.h>
stdlib.h>
pthread.h>
sys/types.h>
linux/sem.h>
voidP(intsemid,intindex);
voidV(intsemid,intindex);
intsemid;
inta=0;
intLOOPS=10;
pthread_tp1,p2;
void*subp1();
void*subp2();
main()
{
unionsemunsemopts;
intres;
semid=semget(10,2,IPC_CREAT|0666);
semopts.val=1;
res=semctl(semid,0,SETVAL,semopts);
pthread_create(&
p1,NULL,subp1,NULL);
semopts.val=0;
res=semctl(semid,1,SETVAL,semopts);
p2,NULL,subp2,NULL);
pthread_join(p1,NULL);
pthread_join(p2,NULL);
semctl(semid,0,IPC_RMID,0);
}
voidP(intsemid,intindex)
{structsembufsem;
sem.sem_num=index;
sem.sem_op=-1;
sem.sem_flg=0;
//:
操作标记:
0或IPC_NOWAIT等
semop(semid,&
sem,1);
//1:
表示执行命令的个数
return;
voidV(intsemid,intindex)
structsembufsem;
sem.sem_num=index;
sem.sem_op=1;
void*subp1()
{
inti,j;
for(i=0;
i<
LOOPS;
i++){
P(semid,0);
printf("
subp1:
a=%d\n"
a);
V(semid,1);
}
void*subp2()
P(semid,1);
a+=1;
V(semid,0);
五、调试记录
运行结果及分析
实验结果如预期。
将a每次加一并打印。
实验三DOS系统调用的扩充
Main.c:
#defineflagIPC_CREAT|0666
char*itoa(intnum,char*str,intradix);
intshmid1;
//共享内存s
intshmid2;
//共享内存t
intmain(intargc,char*argv[])
intres,i;
char*s[3];
3;
s[i]=(char*)malloc(sizeof(char)*32);
pid_tp1,p2,p3;
intpp1,pp2,pp3;
semid=semget(1,4,flag);
//第一个信号灯赋值,S是否为空
//第二个信号灯赋值,S是否为满
//第三个信号灯赋值,T是否为空
res=semctl(semid,2,SETVAL,semopts);
//第四个信号灯赋值,T是否为满
res=semctl(semid,3,SETVAL,semopts);
shmid1=shmget(IPC_PRIVATE,100,flag);
shmid2=shmget(IPC_PRIVATE,100,flag);
itoa(semid,s[0],10);
itoa(shmid1,s[1],10);
itoa(shmid2,s[2],10);
if((p1=fork())==0){
execv("
./get"
s);
elseif((p2=fork())==0){
execv("
./copy"
elseif((p3=fork())==0){
./put"
pp1=wait(&
pp1);
//等待get/copy/put结束;
pp2=wait(&
pp2);
//删除信号灯/共享内存
pp3=wait(&
pp3);
shmctl(shmid1,IPC_RMID,0);
shmctl(shmid2,IPC_RMID,0);
exit(0);
char*itoa(intnum,char*str,intradix)
charindex[]="
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
unsignedunum;
inti=0,j,k;
if(radix==10&
&
num<
0)
{
unum=(unsigned)-num;
str[i++]='
-'
elseunum=(unsigned)num;
do{
str[i++]=index[unum%(unsigned)radix];
unum/=radix;
}while(unum);
str[i]='
\0'
if(str[0]=='
)
k=1;
else
k=0;
for(j=k;
j<
=(i-1)/2.0+k;
j++)
{
num=str[j];
str[j]=str[i-j-1+k];
str[i-j-1+k]=num;
}
returnstr;
Get.c:
intmain(intargc,char*argv[])
intsemid=atoi(argv[0]);
char*s;
FILE*in1;
if((in1=fopen("
./source"
"
rb"
))==NULL)exit(-1);
s=(char*)shmat(atoi(argv[1]),NULL,10);
*s=fgetc(in1);
}while((*s!
=EOF));
fclose(in1);
return0;
copy.c:
string.h>
char*s1,*s2;
s1=(char*)shmat(atoi(argv[1]),NULL,10);
s2=(char*)shmat(atoi(argv[2]),NULL,10);
P(semid,2);
*s2=*s1;
V(semid,3);
}while(*s2!
=EOF);
Put.c
//#defineSHM_R|SHM_W10
intn;
FILE*in2;
if((in2=fopen("
./target"
wb"
s=(char*)shmat(atoi(argv[2]),NULL,10);
while
(1){
P(semid,3);
if(*s!
=EOF){
fputc(*s,in2);
V(semid,2);
else{
break;
fclose(in2);
最后执行main程序,得到与源文件一样的目标文件,实验结果与预期的一样。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 原理 试验报告