操作系统实验报告线程
并发拷贝程序
文件排版存档编号:[UYTR-OUPT28-KBNTL98-UYNN208]
操作系统:线程(进程)并发拷贝程
序
附录一:程序代码 #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(\ int i;
for(i=0;i
/*创建管道*/
int pipe_simulate3575(int a[]) {
printf(\ 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(\分配失败,failure to create a pipe\\n\ return -2; }