1、精校版生产者程序与流程图(完整word版)生产者程序与流程图 编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整word版)生产者程序与流程图)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为(完整word版)生产者程序与流程图的全部内容。程序代码:#include stdio.h /定义头文件include time。
2、hinclude unistd.hinclude sys/ipc。hinclude #include sys/sem.h#define PRODUCER 2 /宏定义生产者个数, 2个define COSTOMER 3 /宏定义消费者个数, 3个define WRITE_NUM 6 /宏定义写缓冲次数, 6次define READ_NUM 4 /宏定义读缓冲次数, 4次define SEM_ALL_KEY 1342 define SEM_EMPTY 0 #define SEM_FULL 1define BUF_LENGTH (sizeof(struct container_buffer)) /
3、宏定义缓冲区大小define BUFFER_NUM 3 /宏定义缓冲区个数 , 3个 #define SHM_MODE 0600 /宏定义创建和访问标志/缓冲区结构(循环队列)struct container_buffer /定义共享缓冲区结构 char letterBUFFER_NUM; int head; int tail; int is_empty; /判断缓冲区是否为空的标志;/得到6以内的一个随机数,产生延迟时间int random_num() int t; srand((unsigned)(getpid() + time(NULL)); t = rand() % 6; return
4、 t;/P操作,获得使用权void p(int sem_id, int sem_num) struct sembuf sem_buff; sem_buff.sem_num = sem_num; sem_buff。sem_op = -1; sem_buff.sem_flg = 0; semop(sem_id, &sem_buff, 1);/得到一个随机字符,模拟产品名字char random_letter() char a; srand((unsigned)(getpid() + time(NULL)); a = (char)((char)(rand() 15) + !); return a;/
5、V操作,释放使用权void v(int sem_id, int sem_num) struct sembuf sem_buff; sem_buff.sem_num = sem_num; sem_buff.sem_op = 1; sem_buff.sem_flg = 0; semop(sem_id, &sem_buff, 1);/主函数int main(int argc, char * argv) int shm_id, sem_id; /定义共享内存段标识变量shm_id,定义信号量标识变量sem_id int num_p = 0, num_c = 0, i, j; /定义生产者和消费者的个数
6、变量,初始化为0 struct container_buffer shmptr; /指向缓冲区结构的指针 char pn; /随机字符,代表产品 time_t now; /时间变量 pid_t pid_p, pid_c; /进程pid变量 printf(”Main process starts。n”); sem_id = semget(SEM_ALL_KEY, 2, IPC_CREAT 0660); /创建两个信号量, empty, full semctl(sem_id, SEM_EMPTY, SETVAL, BUFFER_NUM); /索引为SEM_EMPTY的信号量值为3 semctl(s
7、em_id, SEM_FULL, SETVAL, 0); /索引为SEM_FULL的信号量值为0 if ((shm_id = shmget(IPC_PRIVATE, BUF_LENGTH, SHM_MODE)) tail = 0; shmptris_empty = 1; while ((num_p+) PRODUCER) /循环创建2个生产者 if ((pid_p = fork() 0) /创建一个进程 exit(1); /失败退出 /如果是子进程,开始创建生产者 if (pid_p = 0) if (shmptr = shmat(shm_id, 0, 0) = (void *)-1) /将共
8、享段与本进程相连 exit(1); /失败退出 for (i = 0; i WRITE_NUM; i+) /循环尝试在缓冲区内放入数据为WRITE_NUM次 p(sem_id, SEM_EMPTY); /p操作,申请使用权,p(empty) sleep(random_num(); /随机等待一段时间 shmptr-lettershmptrtail = pn = random_letter(); /在缓冲队列里面放入一个产品 shmptr-tail = (shmptrtail + 1) % BUFFER_NUM; shmptris_empty = 0; /更新缓冲区状态为满 now = time
9、(NULL); /取得系统时间 printf(”current time: 02d:%02d:%02dt, localtime(now)tm_hour, localtime(&now)tm_min, localtime(&now)-tm_sec); for (j = (shmptr-tail - 1 = shmptr-head) ? (shmptrtail - 1) : (shmptrtail 1 + BUFFER_NUM); !(shmptris_empty) & j = shmptrhead; j-) /输出缓冲区状态 printf(”%c, shmptrletterj BUFFER_NU
10、M); printf(”tProducer %d puts a product named as c。n, num_p, pn); /输出动作序列 fflush(stdout); /清除文件缓存区 v(sem_id, SEM_FULL); /释放对文件的使用权,V(full) shmdt(shmptr); /将共享段与进程之间解除链接 exit(0); /子进程终止 for (;num_c COSTOMER;num_c+) /循环创建COSTOMER个生产者 if ((pid_c = fork() 0) /创建一个子进程 printf(Error on fork。n); exit(1); /失
11、败退出 /如果是子进程,开始创建消费者 if (pid_c = 0) if ((shmptr = shmat(shm_id, 0, 0) = (void )1) /将共享段与本进程相连 printf(Error on shmat。n”); exit(1); /失败退出 for (i = 0; i lettershmptrhead; /得到读取的产品标示字符 shmptr-head = (shmptr-head + 1) % BUFFER_NUM; shmptr-is_empty = (shmptrhead = shmptrtail); /更新缓冲区产品状态 now = time(NULL);
12、/得到系统时间 printf(”current time: %02d:%02d:02dt”, localtime(now)-tm_hour, localtime(now)tm_min, localtime(now)tm_sec); for (j = (shmptrtail 1 = shmptr-head) ? (shmptrtail - 1) : (shmptr-tail - 1 + BUFFER_NUM); !(shmptr-is_empty) j = shmptr-head; j-) / 输出缓冲区状态 printf(%c”, shmptrletterj % BUFFER_NUM); pr
13、intf(”tConsumer d gets a product named as %c。n, num_c, pn); fflush(stdout); /清除文件缓存区 v(sem_id, SEM_EMPTY); shmdt(shmptr); /解除共享段与本进程的连接 exit(0); /主控程序最后退出 while(wait(0) != -1); /等待子进程结束 shmdt(shmptr); /接触父进程和共享段的连接 shmctl(shm_id, IPC_RMID, 0); /删除共享内存段 semctl(sem_id, IPC_RMID, 0); printf(”Main proce
14、ss ends.n); fflush(stdout); /清除文件缓存区 exit(0);生产者流程图:生产者线程开始资源信号量P操作互斥信号量P操作生产一个产品把产品送入缓冲区互斥信号量V操作资源信号量V操作等待队列中有消费者线程等待队列中有消费者线程线程自我阻塞添加到等待队列线程自我阻塞添加到等待队列未通过未通过通过通过唤醒对头的消费者线程唤醒对头的消费者线程生产者线程结束YYNN消费者流程图:消费者线程开始资源信号量P操作互斥信号量P操作从缓冲区取出一个产品消费一个产品互斥信号量V操作资源信号量V操作等待队列中有生产者线程等待队列中有生产者线程线程自我阻塞添加到等待队列线程自我阻塞添加到等待队列未通过未通过通过通过唤醒对头的生产者线程唤醒对头的生产者线程消费者线程结束YYNN主程序流程图:运行结果如下:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1