Linux进程间如何通信
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"Linux进程间如何通信",在日常操作中,相信很多人在Linux进程间如何通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Linux进程间如何通信"
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网加科技
互联网为科技
互联网公司 科技公司
互联网金融 科技
易互联网科技有限公司
万易互联网科技有限公司
互联网与未来科技
上海致骋互联网科技
亿人帮互联网科技
中国科技互联网公司收入
互联网校园科技培训
南平创想时代互联网科技有限公司
深圳市罗太互联网科技有限公司
科技大学互联网
上海互联网科技公司ppt
国产互联网科技公司
深圳互联网科技园地址
亚光科技低轨卫星互联网
广东猫王互联网科技有限公司电话
互联网科技自媒体灵感
西安纸贵互联网科技有限公司
金融科技创新监管互联网金融
华宇互联网科技
富国互联网科技创新基金
中国的互联网科技企业的崛起
四川慕妮娅互联网科技有限公司
雨阳互联网卡科技有限公司
扫呗互联网科技有限公司
互联网时代科技型公司的机会
互联网科技创业计划的风险分析