操作系统实验报告线程并发拷贝程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统:线程(进程)并发拷贝程序附录一:程序代码
#include<>
#include
#include
#include<>
#include<>
#include<>
#include<>
#define PSIZE 4096 /*管道文件的大小*/
#define BSIZE 128 /*默认缓冲区的大小*/
#define NOFILE 20 /*u_ofile3575表可分配的个数*/
#define NFILE 20 /*file表可分配的个数*/
#define NPIPE 20 /*pipecb3575可分配的个数*/
/*进程的u_file表*/
int u_ofile3575[NOFILE];
/*模拟file表*/
struct
{
char f_flag;/*读写标志,'w'表示写,'r'表示读*/
int f_count;/*表示此表项的状态,=0表示此表项没被使用,可分配;=1表示此表项在被使用,不可再分配*/
int f_inode;/*对应的pipecb3575表下标*/
long f_offset;/*读写指针,当前已读或已写个数*/
}file[NFILE];
/*管道控制块*/
struct
{
char *p_addr;/*管道文件基地址*/
int p_size;/*管道文件大小,PSIZE*/
int p_count;/*=2表示读写都在被进行,=1表示在被读或被写,=0表示管道没被使用,可分配*/
}pipecb3575[NPIPE];
/*模拟管道文件*/
char *pfile;
/*管道的写入写出端*/
int fd[2];
/*锁机制,实现互斥*/
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
/*进程间通信,实现同步*/
pthread_cond_t rflag = PTHREAD_COND_INITIALIZER;/*读信号量*/ pthread_cond_t wflag = PTHREAD_COND_INITIALIZER;/*写信号量*/
/*线程创建函数只能传一个参数,用结构体来封装所有参数*/
struct arg_set
{
char *fname; /*文件名*/
int f; /*传递fdp[]*/ };
/*u_ofile3575表初始化*/
int u_ofile_init3575()
{
printf("init the u_ofile3575\n"); int i;
for(i=0;i u_ofile3575[i] = -1; u_ofile3575[0]=0; u_ofile3575[1]=0; u_ofile3575[2]=0; return 0; } /*创建管道*/ int pipe_simulate3575(int a[]) { printf("start to create a pipe\n"); int i; for(i=0;i { if(u_ofile3575[i]==-1) { a[0] = i;/*读*/ u_ofile3575[i] = 0;/*读端*/ break; } } for(i;i { if(u_ofile3575[i]==-1) { a[1] = i;/*写*/ u_ofile3575[i] = 1;/*写端*/ break; } } if(i>=NOFILE) { printf("u_ofile3575分配失败,failure to create a pipe\n"); return -2; } pfile = (char *)malloc(PSIZE*sizeof(char));/*申请模拟管道用的内存空间*/ if(pfile==NULL)/*申请可能不成功*/ { printf("failure to create a pipe\n"); return -1; } for(i=0;i { if(file[i].f_count!=1) { file[i].f_flag = 'r';/*读标志*/ _inode = 0;/*读对应pipecb3575表下标*/ file[i].f_count = 1;/*file[0]这个表项在被使用,不可再分配*/ file[i].f_offset = 0;/*读指针*/ u_ofile3575[a[0]] = i;/*读端*/ break; } } for(i=0;i { if(file[i].f_count!=1) { file[i].f_flag = 'w';/*写标志*/ _inode = 0;/*写对应pipecb3575控制块下标*/ file[i].f_count = 1;/*file[1]这个表项在被使用,不可再分配*/ file[i].f_offset = 0;/*写指针*/ u_ofile3575[a[1]] = i;/*写端*/ break; } } if(i>=NFILE) { printf("failure to create a pipe\n"); return -1; } for(i=0;i { if(pipecb3575[i].p_count==0) { pipecb3575[i].p_addr = pfile;/*给管道文件基地址赋值*/ pipecb3575[i].p_size = PSIZE;/*管道文件大小*/