In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-04-01 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >
Share
Shulou(Shulou.com)06/01 Report--
这篇文章主要介绍"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进程间如何通信"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.