Linux信号量机制 实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

#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

相关文档
最新文档