关于进程间通信的Linux小程序_Linux

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

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

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

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <signal.h>

const int key = 0x12345678;
static int pfd1[2], pfd2[2];

#define SHM_LEN (10*1024)
#define VAL_NUM 5

int init_shm() {
 int shmid = -1;

 shmid = shmget((key_t)key, SHM_LEN, 0666 | IPC_CREAT);
 if (shmid < 0) {
  printf("shmget failed!\n");
  exit(-1);
 }

 return shmid;
}

void cancel_shm(int shmid) {
 if (shmctl(shmid, IPC_RMID, 0) == -1) {
  printf("shmctl failed!\n");
  exit(-1);
 }
 printf("cancel_shm successfully!\n");
}

void *shm_get(int shmid) {
 void *mem = NULL;

 mem = shmat(shmid, 0, 0);
 if (mem == (void *)-1) {
  printf("shmat failed!\n");
  exit(-1);
 }

 return mem;
}

int get_val(int *val, int num) {
 int i;
 for (i = 0; i < num; i++) {
  printf("please input a num:");
  scanf("%d", val + i);
 }
}
void show_val (int *val, int num) {
 int i;
 for (i = 0; i < num; i++) {
  printf("%d\t", *(val + i));
 }
 printf("\n");
}

int add_val (int *val, int num) {
 int result = 0;
 int i;

 for (i = 0; i < num; i++) {
  result += *(val + i);
 }

 return result;
}

int square_val (int *val, int num) {
 int result = 0;
 int i, tmp;

 for (i = 0; i < num; i++) {
  tmp = *(val + i);
  result += (tmp * tmp);
 }

 return result;
}

void TELL_WAIT (void) {
 if (pipe(pfd1) < 0 || pipe(pfd2) < 0) {
  printf("pipe error!\n");
  exit(-1);
 }
}

void TELL_PARENT (pid_t pid) {
 if (write(pfd2[1], "c", 1) != 1) {
  printf("write error!\n");
  exit(-1);
 }
}

void WAIT_PARENT (void) {
 char c;

 if (read(pfd1[0], &c, 1) != 1) {
  printf("read error!\n");
  exit(-1);
 }
}

void TELL_CHILD (pid_t pid) {
 if (write(pfd1[1], "p", 1) != 1) {
  printf("write error!\n");
  exit(-1);
 }
}

void WAIT_CHILD (void) {
 char c;

 if (read(pfd2[0], &c, 1) != 1) {
  printf("read error!\n");
  exit(-1);
 }
}

int main(int argc, char *argv[]) {
 void *mem = NULL;
 int shmid = -1;
 pid_t pid = -1;
 int val[VAL_NUM];
 int result = 0;

 shmid = init_shm();

 TELL_WAIT();
 if ((pid = fork()) < 0) {  //error
  printf("fork error!\n");
  exit(-1);
 } else if (pid == 0) {   //child
  int result = 0;

  WAIT_PARENT();

  mem = shm_get(shmid);  //get share memery

  memcpy(val, mem, sizeof(int) * VAL_NUM);
  result = square_val(val, VAL_NUM); 

  *(int *)((void *)mem + SHM_LEN - 4) = result;

  TELL_PARENT(pid);

  exit(1);
 } else {      //parent
  int child_result = 0;

  mem = shm_get(shmid);  //get share memery
  get_val(val, VAL_NUM);  //get user input
  memcpy(mem, val, sizeof(int) * VAL_NUM); //copy user input to share memery

  TELL_CHILD(pid);

  result = add_val(val, VAL_NUM);

  WAIT_CHILD();
  child_result = *(int *)((void *)mem + SHM_LEN - 4);
  printf("result:%d, child_result:%d, all:%d\n", result, child_result, result + child_result);
 }

 cancel_shm(shmid);

 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索Linux进程间通信
Linux小程序
linux进程间通信、linux进程通信、linux进程间通信方式、linux c 进程间通信、linux进程间的通信,以便于您获取更多的相关知识。

时间: 2024-08-01 08:47:22

关于进程间通信的Linux小程序_Linux的相关文章

网络编程-用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 ==

问题描述 用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 == //服务器端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<mallo

Linux 下编译c++ opengl的小程序

问题描述 Linux 下编译c++ opengl的小程序 完整的代码如下 #include <GL/glut.h> #include <cmath> #include <utility> #include <vector> using std::vector; using std::pair; vector<pair<int, int> > my_points(4); vector<pair<int, int> &g

linux作为防火墙,编一个小程序,实现我选择一个ip , 就显示这个ip的上网历史记录! 大家说说吧!linux作为防火墙

问题描述 linux作为防火墙,编一个小程序,实现我选择一个ip,就显示这个ip的上网历史记录!大家说说吧!要是非要安装软件的话,最好是linux自带的或是开源的.

C语言编写获取Linux本地目录及本机信息的小程序实例_C 语言

展示目录的小程序展示指定目录的小程序: #include <unistd.h> #include <stdio.h> #include <dirent.h> #include <string.h> #include <sys/stat.h> #include <stdlib.h> void printdir(char *dir,int depth){ DIR *dp; struct dirent *entry; struct stat

ACCESS数据库向MySQL快速迁移小程序(一)

access|mysql|程序|数据|数据库 近日,本人为了将为公司开发的一个信息管理系统从以前试运行的开发机器上(Windows NT + IIS4.0 + Access)迁移至一台真正的Linux服务器上(Apache1.3.12 + PHP 4.03 + MySQL 3.23.26),其中数据库中的几十个表的内容迁移,开始让我小费了一些周折,从网上也下载了一些MySqL的客户软件或是数据库管理软件,写得较好的软件均有数据迁移功能,但其迁移方式不外乎两种,一种是采用文件引入方式,此种方式在处

MySQL嵌入式版本的小程序例子

MySQL嵌入式版本越来越式微了.碰巧有个小应用用到了它,顺便记录一下.  文档可以参考http://dev.mysql.com/doc/refman/5.6/en/libmysqld-example.html,看起来年久失修的样子,没法一看就懂.  希望下面这个简化的步骤可以起到点作用.  1. 下载代码并且进行版本编译.这个还比较简单,文档说的也很靠谱.  $ cmake . -DCMAKE_INSTALL_PREFIX=/home/mysql -DWITH_EMBEDDED_SERVER=

独家 | 手把手教你用scrapy制作一个小程序 !(附代码)

目录 一.前言 二.原理 2.1 爬取流程 2.2 各部块的解释 2.3 scrapy数据流的分析 三.理解 四.实战 4.1 首先是安装scrapy 4.2 建立项目和下载pycharm以及pycharm的配置 4.3 提取标题名和作者名 4.4 scrapy流程解析 4.5 小项目难度加深 五.对scrapy建立项目的feedback 5.1 如何更快地找 bug 5.2 共存解释器可能导致的种种报错 六.知识补充 6.1 Spider中的类和方法 一. 前言 Scrapy是用于Python

教你从零开始使用wordpress做为后台生成小程序(小白版教程)

准备工作 1服务器 最好使用Linux服务器,小白推荐安装宝塔面板. 2备案域名 3.小程序账号 建议注册企业账号,可以使用已认证的公众号快速创建. 4.七牛账号 CDN使用,加快网站访问速度.如需使用小程序发帖,也会用到. 5.下载小程序源码 源码下载地址https://github.com/iamxjb/winxin-app-watch-life.net(由jianbo开发,如果大家按照此教程搭建成功,请记得赞赏jianbo,只有这样才会良性循环.记住,懂得感恩的人或获得更多,越吝啬的人越赚

《嵌入式 Linux应用程序开发标准教程(第2版)》——导读

前 言 嵌入式 Linux应用程序开发标准教程(第2版) 第2版说明 本书第1版<嵌入式Linux应用程序开发详解>自2006年7月出版以来,受到了广大读者的一致好评,已经多次印刷,累计销量18000册.许多高等院校.职业学校和培训机构也将本书作为嵌入式专业的教材.许多读者提出了宝贵的意见和中肯的建议. 第2版图书在第1版基础上做了以下修订. 增加PPT教学课件:本书第2版增加了PPT教学课件,方便老师教学使用. 赠送嵌入式专家授课视频:本书第2版免费赠送超值的嵌入式教学视频,所讲内容均为嵌入