国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 服務(wù)器 > Linux服務(wù)器 > 正文

關(guān)于進(jìn)程間通信的Linux小程序

2024-09-05 23:02:33
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要為大家詳細(xì)介紹了一個(gè)關(guān)于進(jìn)程間通信的Linux小程序,主要利用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通信,使用管道實(shí)現(xiàn)進(jìn)程間競(jìng)爭(zhēng)關(guān)系,感興趣的朋友可以參考一下
 

利用工作之余為小伙伴寫(xiě)了份作業(yè),關(guān)于進(jìn)程間通信的。題目如下:

“父進(jìn)程從鍵盤(pán)上接受1000個(gè)數(shù)據(jù),對(duì)其求和sum1,子進(jìn)程對(duì)這1000個(gè)數(shù)平方和sum2,結(jié)果傳給父進(jìn)程,父進(jìn)程將sum1+sum2后,打印結(jié)果。”

要求:用大小為10的共享區(qū)傳遞1000個(gè)數(shù)據(jù);子進(jìn)程用消息機(jī)制將sum2傳給父進(jìn)程。 

主要利用共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通信,使用管道實(shí)現(xiàn)進(jìn)程間競(jìng)爭(zhēng)關(guān)系,F(xiàn)reeBSD下測(cè)試通過(guò)。代碼如下:時(shí)間有限,有可能有些不足,希望高手給予指點(diǎn)。

#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 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;}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 常德市| 淅川县| 永安市| 武隆县| 阜城县| 常州市| 庆安县| 西乌珠穆沁旗| 巴中市| 衡阳县| 临夏市| 柳林县| 双牌县| 岗巴县| 南木林县| 怀柔区| 特克斯县| 长治市| 汉中市| 海口市| 玉环县| 鹤岗市| 哈密市| 湖北省| 连南| 内黄县| 西和县| 渭南市| 富民县| 长顺县| 巫溪县| 获嘉县| 光泽县| 沈丘县| 唐河县| 万荣县| 兰西县| 章丘市| 安康市| 台东市| 正蓝旗|