操作系统实验报告线程并发拷贝程序

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

相关文档
最新文档