命名管道实现进程间通信--石头、剪刀、布游戏 分类: linux 2014-06-01 22:50 467人阅读 评论(0) 收藏
下面这个程序利用命名管道实现进程间通信,模拟石头剪刀布游戏。
主进程为裁判进程,两个子进程为选手进程。裁判与选手间各建立一个命名管道。
进行100次出招,最后给出游戏胜负。
- #include <unistd.h>
- #include<fcntl.h>
- #include<stdio.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<errno.h>
- #include<stdlib.h>
- #include<string.h>
- #define FIFO1 "/tmp/myfifo1"
- #define FIFO2 "/tmp/myfifo2"
- #define SIZE 5
- #define COUNT 100
- int judge(char a,char b);
- int main(void)
- {
- int fp,fp1,fp2,i=1;
- int status;
- int nread;
- char buf[SIZE]={0};
- char c1[COUNT]={0};//用来存放p1发送的消息
- char c2[COUNT]={0};//用来存放p2发送的消息
- pid_t p1 = fork(); //产生子进程p1
- /*********************************/
- if(p1==0)
- {
- srand(time(NULL));
- while((fp=open(FIFO1,O_WRONLY|O_NONBLOCK))==-1);//只写打开管道1,不断尝试直到成功
- for(;i<=100;i++)
- {
- sprintf(buf,"%d",rand()%3);//随机产生0-2的数字写入管道
- while(write(fp,buf,SIZE)==-1);//不断尝试写直至成功
- }
- close(fp);
- return 0;
- }
- /*********************************/
- pid_t p2=fork(); //产生子进程p2,程序结构同p1
- /*********************************/
- if(p2==0)
- {
- srand(time(NULL)+100);
- while((fp=open(FIFO2,O_WRONLY|O_NONBLOCK))==-1);
- for(;i<=100;i++)
- {
- sprintf(buf,"%d",rand()%3);
- while(write(fp,buf,SIZE)==-1);
- }
- close(fp);
- exit(0);
- }
- /**************************************/
- //创建2个管道
- if((mkfifo(FIFO1,0777)<0)&&(errno!=EEXIST))
- {
- printf("cannot create fifo.\n");
- exit(1);
- }
- if((mkfifo(FIFO2,0777)<0)&&(errno!=EEXIST))
- {
- printf("cannot create fifo.\n");
- exit(2);
- }
- memset(buf,0,sizeof(buf));//清空缓冲区
- //只读方式打开两个命名管道
- while((fp1=open(FIFO1,O_RDONLY|O_NONBLOCK,0))==-1);
- while((fp2=open(FIFO2,O_RDONLY|O_NONBLOCK,0))==-1);
- sleep(3);//等待两个子进程中打开管道写端并输入数据,必要
- for(;i<=100;i++)//连续读取100个数据
- {
- nread=read(fp1,buf,SIZE);
- if(nread!=-1&&nread!=0)
- {
- c1[i]=buf[0];//结果存放至c1
- }
- }
- i=1;
- for(;i<=100;i++)
- {
- nread=read(fp2,buf,SIZE);
- if(nread!=-1&&nread!=0)
- {
- c2[i]=buf[0];//结果存放至c2
- }
- }
- int j=1;
- int p1w=0,p2w=0,pd=0;
- for(;j<=100;j++)
- {
- int tmp=judge(c1[j],c2[j]);
- printf("round %d:",j);
- if(tmp==0)
- {
- printf("in a draw!\n");
- pd++;//平局
- }
- else
- {
- printf("%s wins!\n",(tmp>0)?"p1":"p2");
- if(tmp>0)p1w++;//p1胜
- else p2w++; //p2胜
- }
- }
- //打印最终统计结果
- printf("In summary:\n");
- printf("p1 wins %d rounds.\n",p1w);
- printf("p2 wins %d rounds.\n",p2w);
- printf("%d rounds end in a draw.\n",pd);
- printf("%s wins in the game!\n",(p1w>p2w)?"p1":"p2");
- //等待两个子进程结束
- if(waitpid(p1,&status,0) < 0)
- {
- perror("waitpid");
- exit(5);
- }
- if(waitpid(p2,&status,0)< 0)
- {
- perror("waitpid");
- exit(6);
- }
- exit(0);
- }
- //0——石头,1——剪刀,2——布
- int judge(char a,char b)//规定游戏判定规则
- {
- int r=0;
- if(a==b)
- r=0;
- else
- {
- if(a=='0'&&b=='1')r=1;
- if(a=='0'&&b=='2')r=-1;
- if(a=='1'&&b=='2')r=1;
- if(a=='1'&&b=='0')r=-1;
- if(a=='2'&&b=='0')r=1;
- if(a=='2'&&b=='1')r=-1;
- }
- return r;
- }
结果:
版权声明:本文为博主原创文章,未经博主允许不得转载。
命名管道实现进程间通信--石头、剪刀、布游戏 分类: linux 2014-06-01 22:50 467人阅读 评论(0) 收藏的更多相关文章
- 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏
一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...
- 09_编写脚本,实现人机<石头,剪刀,布>游戏
#!/bin/bashgame=(石头 剪刀 布)num=$[RANDOM%3]computer=${game[$num]}#通过随机数获取计算机的出拳#出拳的可能性保存在一个数组中,game[0], ...
- Pygame:编写一个小游戏 标签: pythonpygame游戏 2017-06-20 15:06 103人阅读 评论(0)
大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...
- 用Micro:bit做剪刀、石头、布游戏
剪刀.石头.布游戏大家都玩过,今天我们用Micro:bit建一个剪刀.石头.布游戏! 第一步,起始 当你摇动它时,我们希望the micro:bit选择剪刀.石头.布.尝试创建一个on shake b ...
- c++下使用命名管道实现进程间通信
前面已经使用邮槽实现过进程间通信:http://www.cnblogs.com/jzincnblogs/p/5192654.html ,这里使用命名管道实现进程间通信. 与邮槽不同的是,命名管道在进程 ...
- Python 石头 剪刀 布
di = {1: '石头', 2: '剪刀', 3: '布'} def win(x, y): if len({x[0], y[0]}) == 1: print('平局.') else: if {x[0 ...
- 自己写的一个小的剪刀——石头——布游戏的GUI程序
很简单的一个程序,建议各位初学Java的同学可以试试写写这个程序: import javax.swing.JOptionPane; public class Game { public static ...
- 用 Python 编写剪刀、石头、布的小游戏(快速学习python语句)
import random#定义手势类型allList = ['石头','剪刀','布']#定义获胜的情况winList = [['石头','剪刀'],['剪刀','布'],['步','石头']]pr ...
- SQL Server 连接问题-命名管道
原文:SQL Server 连接问题-命名管道 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx 一.前言 ...
随机推荐
- Null value was assigned to a property of primitive type setter of原因及解决
出现Null value was assigned to a property of primitive type setter of错误是由于类型不匹配,将字段的属性由hibernate的int类型 ...
- A Single Channel with Multiple Consumers RabbitMQ
http://stackoverflow.com/questions/30696351/a-single-channel-with-multiple-consumers-rabbitmq up vot ...
- C# LINQ Unity 单例
C# LINQ 1. 自定义 Master,Kongfu 类 1 class Master 2 { 3 4 public int Id { get; set; } 5 public string ...
- 游戏server设计的一些感悟
Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:September 30 ...
- Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) E. Prairie Partition 二分+贪心
E. Prairie Partition It can be shown that any positive integer x can be uniquely represented as x = ...
- 可以声明接口,但不可以new接口
接口是一种特殊的抽象类,它包含常量和方法的声明,但没有方法的实现:可以把接口看成是一种特殊的抽象类: 接口实质上是一种规范,它关心的是"做什么",不关心"怎样做" ...
- rip是典型的距离矢量动态路由协议。Ospf是链路状态型的协议
网络工程师十个常见面试问题-看准网 https://m.kanzhun.com/k-mianshiwenti/1465113.html 两者都属于IGP协议,rip是典型的距离矢量动态路由协议.Osp ...
- Rod Johnson
Spring Framework创始人,著名作者. Rod在悉尼大学不仅获得了计算机学位,同时还获得了音乐学位.更令人吃惊的是在回到软件开发领域之前,他还获得了音乐学的博士学位. 有着相当丰富的C/C ...
- 滚动条样式优化(CSS3自定义滚动条样式 -webkit-scrollbar)
有时候觉得浏览器自带的原始滚动条不是很美观,那webkit浏览器是如何自定义滚动条的呢? Webkit支持拥有overflow属性的区域,列表框,下拉菜单,textarea的滚动条自定义样式.当然,兼 ...
- YTU 2897: E--外星人供给站
2897: E--外星人供给站 时间限制: 2 Sec 内存限制: 128 MB 提交: 20 解决: 13 题目描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但 ...