Linux进程间如何通信
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍"Linux进程间如何通信",在日常操作中,相信很多人在Linux进程间如何通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Linux进程间如何通信"
千家信息网最后更新 2025年11月07日Linux进程间如何通信
这篇文章主要介绍"Linux进程间如何通信",在日常操作中,相信很多人在Linux进程间如何通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Linux进程间如何通信"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
题目如下:
"父进程从键盘上接受1000个数据,对其求和sum1,子进程对这1000个数平方和sum2,结果传给父进程,父进程将sum1+sum2后,打印结果。"
要求:用大小为10的共享区传递1000个数据;子进程用消息机制将sum2传给父进程。
主要利用共享内存实现进程间通信,使用管道实现进程间竞争关系,freebsd下测试通过。代码如下:时间有限,有可能有些不足,希望高手给予指点。
#include#include #include #include #include const int key = 0x12345678;static int pfd1[2], pfd2[2];#define shm_len (10*1024)#define val_num 5int 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进程间如何通信"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
进程
通信
学习
数据
更多
结果
帮助
实用
接下来
个数
代码
内存
大小
平方和
文章
方法
时间
有限
机制
消息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
厦门网络安全技术培训课程
广西飞宇网络技术有限公司
数据库原理自考
物流软件开发需要什么技术
ipsec服务器软件
微软fox数据库的作用
标志物数据库
java更新数据库
广州公积金服务器维护
网络安全本质是保护
软件开发面临哪些法律风险
管理软件开发系统方案
文书档案数据库录入工作
数据库密码转换
服务器怎么从光盘启动不了
mc服务器端
软件开发效率指的是
网络技术应用各章节知识点
电子软件开发有限公司
怎样清除掉网贷上面的数据库
演讲稿六年级网络安全
数据库事务慢
网络安全自学好还是老师教
语义网软件开发公司
公安局网络安全保密
随访中心数据库建设
戴尔服务器主板检测灯绿灯闪
猫头鹰 网络安全
网络安全防护的四个基本原则
互联网企业科技助力海外公民防控