1
南昌大学实验报告
---
?/p>
2
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
?/p>
学生姓名?/p>
张皓?/p>
?/p>
号:
5501215001
专业班级?/p>
本硕
151
实验类型:□
验证
?/p>
综合
?/p>
设计
?/p>
创新
实验日期?/p>
2017.5.5
实验成绩?/p>
一、实验目?/p>
通过实验加强对进程同步和互斥的理解,
并掌握进程(线程?/p>
的创建和调用方法?/p>
学会
使用信号量解决资源共享问题。学生可以自己选择?/p>
Windows
?/p>
Linux
系统下编写?/p>
二、实验内?/p>
(一)以下为
Linux
系统下参考程序,请编译、运行并观察程序的输出,并分析实验结
果,写出实验报告?/p>
#include<stdio.h>//
标准输入输出头文?/p>
#include<stdlib.h>//standard library
标准库头文件
#include<unistd.h>//POSIX
标准定义?/p>
unix
类系统定义符号常量的头文件,
包含了许?/p>
UNIX
系统服务的函数原型,例如
read
函数?/p>
write
函数?/p>
getpid
函数?/p>
#include<time.h>//time.h
?/p>
C
标准库头文件,主要是一些和时间相关的函?/p>
#include<sys/types.h>//
基本系统数据类型
#include<sys/wait.h>//declarations for waiting
#include<linux/sem.h>//Semaphore operation flags
#define NUM_PROCS 5//5
个子进程
#define SEM_ID
250//
信号?/p>
#define FILE_NAME "/tmp/sem_aaa"
#define DELAY
4000000
void update_file(int sem_set_id, char *file_path, int number){
struct sembuf sem_op;
FILE *file;//
建立一个文件指?/p>
//
等待信号量的数值变为非负数,此处设为负值,相当于对信号量进?/p>
P
操作
sem_op.sem_num=0;
sem_op.sem_op=-1;
sem_op.sem_flg=0;
semop(sem_set_id,&sem_op,1);
/*
操作一组信号,进程的标识符号为
sem_set_id
?/p>
sem_op
是结构指针?/p>
sem_op
:如果其值为正数,该值会加到现有的信号内含值中,通常用于释放所控资源的?/p>
用权;如?/p>
sem_op
的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信?/p>
值大于或等于
sem_op
的绝对值,
通常用于获取资源的使用权?/p>
如果
sem_op
的值为
0
?/p>
则操
作将暂时阻塞,直到信号的值变?/p>
0
?/p>
*/
//
写文件,写入的数值是当前进程的进程号
file=fopen(file_path,"w");
//
写文件,若成功则返回文件起始地址;否则置

0