【linux】——一个小程序

利用工作之余为小伙伴写了份作业,关于进程间通信的。题目如下:


父进程从键盘上接受1000个数据,对其求和sum1,子进程对这1000个数平方和sum2,结果传给父进程,父进程将sum1+sum2后,打印结果。

要求:用大小为10的共享区传递1000个数据;子进程用消息机制将sum2传给父进程。

主要利用共享内存实现进程间通信,使用管道实现进程间竞争关系,FreeBSD下测试通过。代码如下:时间有限,有可能有些不足,希望高手给予指点。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <sys/shm.h>
  5 #include <signal.h>
  6
  7 const int key = 0x12345678;
  8 static int pfd1[2], pfd2[2];
  9
 10 #define SHM_LEN    (10*1024)
 11 #define VAL_NUM    5
 12
 13 int init_shm() {
 14     int shmid = -1;
 15
 16     shmid = shmget((key_t)key, SHM_LEN, 0666 | IPC_CREAT);
 17     if (shmid < 0) {
 18         printf("shmget failed!\n");
 19         exit(-1);
 20     }
 21
 22     return shmid;
 23 }
 24
 25 void cancel_shm(int shmid) {
 26     if (shmctl(shmid, IPC_RMID, 0) == -1) {
 27         printf("shmctl failed!\n");
 28         exit(-1);
 29     }
 30     printf("cancel_shm successfully!\n");
 31 }
 32
 33 void *shm_get(int shmid) {
 34     void *mem = NULL;
 35
 36     mem = shmat(shmid, 0, 0);
 37     if (mem == (void *)-1) {
 38         printf("shmat failed!\n");
 39         exit(-1);
 40     }
 41
 42     return mem;
 43 }
 44
 45 int get_val(int *val, int num) {
 46     int i;
 47     for (i = 0; i < num; i++) {
 48         printf("please input a num:");
 49         scanf("%d", val + i);
 50     }
 51 }
 52 void show_val (int *val, int num) {
 53     int i;
 54     for (i = 0; i < num; i++) {
 55         printf("%d\t", *(val + i));
 56     }
 57     printf("\n");
 58 }
 59
 60 int add_val (int *val, int num) {
 61     int result = 0;
 62     int i;
 63
 64     for (i = 0; i < num; i++) {
 65         result += *(val + i);
 66     }
 67
 68     return result;
 69 }
 70
 71 int square_val (int *val, int num) {
 72     int result = 0;
 73     int i, tmp;
 74
 75     for (i = 0; i < num; i++) {
 76         tmp = *(val + i);
 77         result += (tmp * tmp);
 78     }
 79
 80     return result;
 81 }
 82
 83 void TELL_WAIT (void) {
 84     if (pipe(pfd1) < 0 || pipe(pfd2) < 0) {
 85         printf("pipe error!\n");
 86         exit(-1);
 87     }
 88 }
 89
 90 void TELL_PARENT (pid_t pid) {
 91     if (write(pfd2[1], "c", 1) != 1) {
 92         printf("write error!\n");
 93         exit(-1);
 94     }
 95 }
 96
 97 void WAIT_PARENT (void) {
 98     char c;
 99
100     if (read(pfd1[0], &c, 1) != 1) {
101         printf("read error!\n");
102         exit(-1);
103     }
104 }
105
106 void TELL_CHILD (pid_t pid) {
107     if (write(pfd1[1], "p", 1) != 1) {
108         printf("write error!\n");
109         exit(-1);
110     }
111 }
112
113 void WAIT_CHILD (void) {
114     char c;
115
116     if (read(pfd2[0], &c, 1) != 1) {
117         printf("read error!\n");
118         exit(-1);
119     }
120 }
121
122 int main(int argc, char *argv[]) {
123     void *mem = NULL;
124     int shmid = -1;
125     pid_t pid = -1;
126     int val[VAL_NUM];
127     int result = 0;
128
129     shmid = init_shm();
130
131     TELL_WAIT();
132     if ((pid = fork()) < 0) {        //error
133         printf("fork error!\n");
134         exit(-1);
135     } else if (pid == 0) {            //child
136         int result = 0;
137
138         WAIT_PARENT();
139
140         mem = shm_get(shmid);        //get share memery
141
142         memcpy(val, mem, sizeof(int) * VAL_NUM);
143         result = square_val(val, VAL_NUM);
144
145         *(int *)((void *)mem + SHM_LEN - 4) = result;
146
147         TELL_PARENT(pid);
148
149         exit(1);
150     } else {                        //parent
151         int child_result = 0;
152
153         mem = shm_get(shmid);        //get share memery
154         get_val(val, VAL_NUM);        //get user input
155         memcpy(mem, val, sizeof(int) * VAL_NUM);    //copy user input to share memery
156
157         TELL_CHILD(pid);
158
159         result = add_val(val, VAL_NUM);
160
161         WAIT_CHILD();
162         child_result = *(int *)((void *)mem + SHM_LEN - 4);
163         printf("result:%d, child_result:%d, all:%d\n", result, child_result, result + child_result);
164     }
165
166     cancel_shm(shmid);
167
168     return 0;
169 }
时间: 2024-10-15 04:32:42

【linux】——一个小程序的相关文章

先做一个“小程序”——关于微信应用号的六大猜想

先做一个“小程序”——关于微信应用号的六大猜想 9月 21 日,苦等了9个多月的时间,应用号终于与我们见面了,命名为「小程序」. 01 为什么推出小程序? 考虑到小程序对整个APP市场的影响,毫无疑问会对现有的APP生态带来一定的冲击.但是,之所以推出小程序,最直接的原因可能是为了构建和扩充微信生态链,让微信更具开放性. 如我们所知,目前微信公众号分为三类: • 服务号,连接人和商品,目前很多电商企业,以及在微信端提供产品和服务的企业都用服务号. • 订阅号,微信官方的定位是阅读,连接人和资讯的

关于链表的一个小程序

关于链表的一个小程序: /**************************链表*****************************//* 具备功能 *//* 链表按元素位置插入 *//* 链表按元素位置删除 *//* 链表全表遍历 *//* 链表整表创建(头插法) *//* 链表整表创建(尾插法) *//* 链表整表删除 *//**************************链表*****************************/ #include<stdio.h>#in

原创观点:还在认为企业或个人只能申请一个小程序吗?

今天第一次体验了整个小程序注册流程,使用的是我自己的这个简单的教程(个人无appid如何进行申请开发者权限,简单操作步骤),教程虽然是我的,我自己却没有真的实践过,真是误人子弟,自己也不一定能知道:今天亲自测试了一下:首先走完邮箱验证: 验证完毕后,开始进入信息登录,这里,有一些关键信息,是本文观点的主要支撑: 请输入管理员的身份证号码,一个身份证号码只能注册5个小程序. 然后填写完毕后,到了第二个关键点: 为了验证你的身份,请用绑定了管理员本人银行卡的微信扫描二维码. 这个点,透露了两个信息,

Python 练习册,每天一个小程序

Python 练习册,每天一个小程序 说明: Python 练习册,每天一个小程序.注:将 Python 换成其他语言,大多数题目也适用 不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 点此链接,会看到每个题目的代码, 欢迎大家 Pull Request 出题目,贴代码(Gist.Blog皆可):-) 本文本文由@史江歌([email protected] QQ:499065469)根据互联网资料收集整理而成,感谢互联网,感谢各位的分享.鸣谢!本文会不断更新. Talk is chea

Python练习册,每天一个小程序

Python练习册,每天一个小程序 精选评论关注该公众号可参与评论 写评论 加载中 以上评论由公众帐号筛选后显示 Python练习册,每天一个小程序 提交 我的评论 已评论 Python练习册,每天一个小程序 2014-12-15 程序猿 说明: ●Python 练习册,每天一个小程序.注:将 Python 换成其他语言,大多数题目也试用 ●不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 ●欢迎大家 Pull Request 出题目,贴代码(Gist.Blog皆可):-) ●访问链接h

一个小程序能够反映的能力

程序员小郑刚步入岗位,但是在公司编码过程中没有受到专业的编码规范的培训,编写出来的程序虽然能够完成指定的功能但是比较不统一,偶尔会别出心裁的设计出自己的简化方法.老王这是从事了软件编码十多年了,现在都快到不惑的年龄了,在软件行业摸爬滚打十多年从事过多个行业,接触过不同公司的编码的规范,在软件代码编写中有独到的认识. 有一天有一个小功能的改动,由于这是一个非常重要的基础系统的功能变动,所以即便是一个小的功能变动公司上上下下都投入了非常高的重视程度.这天老王找到小郑告诉了需要修改这个系统并详细的描述

Python 练习冊,每天一个小程序

Python 练习冊,每天一个小程序 说明: Github 原文地址: 点击打开链接 Python 练习冊.每天一个小程序.注:将 Python 换成其它语言,大多数题目也试用 不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 欢迎大家 Pull Request 出题目.贴代码(Gist.Blog皆可):-) Talk is cheap. Show me the code.--Linus Torvalds 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字.类似于微

mono for Android 环境配置(环境搭建+破解方法+运行一个小程序)

一.准备工作:下载相关软件工具,为搭建环境做准备. 哎!百度网盘无法分享,根据名称下载. 二.首先安装 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008 这里选择安装jdk6,网上看到一篇文章说jdk7及以上,mono还没有支持,但是那篇文字一年前写的,目前 支不支持,不清楚.这里保险起见,安装jdk6,mono是支持的.    注意环境变量的配置,这里不详细描述.主要配置java_home,path,class_path. 三.安装mono-2.1

c++学习笔记---02---从一个小程序说起

从一个小程序说起 这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系. 问题探索 问题:对一个整型数组求和. 要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务. 赶紧的:大家一起动手! 参考: #include <stdio.h> int addArray( int array[], int n ); int main() { int data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int size = sizeof(data) /

c++学习笔记---03---从一个小程序说起2

从一个小程序说起2 要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置.当用户按下键盘上的"Enter"键时,数据输入结束.程序自动对所有的整数进行求和并打印出结果. C语言版本: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void main() 5 { 6 int i; 7 int sum = 0; 8 char ch; 9 10 printf(&