Linux信号量机制 实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大作业一 Linux信号量机制
姓名:
学号:
班级:
日期:2015年7月
1 需求说明
目标:
本次实验的目标是在Linux环境下实现一个多线程对临界资源的互斥操作,利用信号量实现对临界资源的保护,支持Linux下文件输入输出,提高对Linux 环境下多进程、多线程、信号量机制和文件操作等知识的理解。
2 设计说明
有进程A、B、C,分别调用过程get、copy、put对缓冲区S和T进行操作。其中get负责从文件F_in中把数据块读入并输出缓冲区S,copy负责从S中提取数据块并复制到缓冲区T中,put负责从缓冲区T中取出信息存入到本地文件F_out中。实现get、copy、put的操作过程。
2.1 结构设计
三个信号量实现线程互斥
sem_tread_sem; // read
sem_twrite_sem; // write
sem_tcopy_sem; // copy
2.2 功能设计
实现了同步多线程运行,文件读入,缓冲区COPY,文件写入三个线程同时运行,完成LINUX下文件的输入输出。
文件读入:用linux下open(),read(),lseek()函数实现
文件写出:用linux下open(),write()实现
缓冲区建立malloc()函数
信号量建立sem_init(),sem_wait(),sem_post()
互斥量建立pthread_create(),pthread_mutex_lock(),pthread_mutex_unlock()
3 测试和使用说明
3.1 使用说明
使用./signalmove启动程序,启动参数必须包括,写入文件名,写出的文件名,和缓冲区大小,否则会报错退出。
缓冲区大小必须为数字,否则退出。
3.2 测试说明
4 程序清单
[cpp] view plaincopy
OBJS=main.o copy.o get.o put.o file.o signalmove:$(OBJS) signalmove.h
gcc $(OBJS) -o signalmove -lpthread main.o:main.c signalmove.h
gcc -c main.c -lpthread
copy.o:copy.c signalmove.h
gcc -c copy.c
get.o:get.c signalmove.h
gcc -c get.c
put.o:put.c signalmove.h
gcc -c put.c
file.o:file.c signalmove.h
gcc -c file.c
/*
* signalmove.h
*
* Created on: May 14, 2012 * Author: dell
*/
#ifndef SIGNALMOVE_H_
#define SIGNALMOVE_H_
#include
#include
#include
#include
#include
#include
#include
//file works
void file_in();
void file_out();
//copy from s to t
void copy();
//put and get
void put();
void get();
sem_t read_sem; // read
sem_t write_sem; // write
sem_t copy_sem; // copy
pthread_mutex_t read_mutex; // pthread mutex for read
pthread_mutex_t write_mutex; // pthread mutex for write
char *data_s; //read buffer
char *data_t; //write buffer
int len; //buffer length
char *filename_out; //name_out
char *filename_in; //name_in
int result;
int result_copy;
#endif /* SIGNALMOVE_H_ */
/*
* main.c
*
* Created on: May 14, 2012 * Author: dell
*/
#include "signalmove.h"
int isdigit_all(char *str) {
while (*str != '\0')
{
if (!isdigit(*str++)) return 0;
}
return 1;
}
//signal out