进程间通信的Linux小程序问题怎么解决
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇"进程间通信的Linux小程序问题怎么解决"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看
千家信息网最后更新 2026年11月04日进程间通信的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安全错误
数据库的锁怎样保障安全
华服互联网科技靠谱吗
广东万易互联网科技有限公司惠州分公司
互联网科技活动banner
科技互联网政务服务
互联网中国科技
港股互联网科技股
网络科技有限互联网
南京欣网互联网科技
丰台科技园 互联网
互联网科技素材视频竖屏
深圳互联网科技怎么样
剑昆互联网络科技有限公司临桂
黑科技闪耀互联网之光
华夏互联网科技业
广西互联网科技孵化中心
长沙互联网科技
伍佰万互联网科技怎么赚钱
互联网科技资金流入
广州梦谷互联网科技有限公司领导
北京瑞云互联网科技有限公司
科技互联网产品
科技平台互联网
网络科技有限互联网
万易互联网科技有限公司
米客互联网科技
狮子座互联网科技培训
华夏恒生科技与互联网科技
元气玛特互联网科技公司是外包吗
美国互联网科技公司
中国主要互联网科技公司