成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Linux進(jìn)程間如何通信

這篇文章主要介紹“Linux進(jìn)程間如何通信”,在日常操作中,相信很多人在Linux進(jìn)程間如何通信問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux進(jìn)程間如何通信”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元天柱做網(wǎng)站,已為上家服務(wù),為天柱各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

題目如下:

“父進(jìn)程從鍵盤上接受1000個數(shù)據(jù),對其求和sum1,子進(jìn)程對這1000個數(shù)平方和sum2,結(jié)果傳給父進(jìn)程,父進(jìn)程將sum1+sum2后,打印結(jié)果?!?/strong>

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

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

#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 5

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

到此,關(guān)于“Linux進(jìn)程間如何通信”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

新聞名稱:Linux進(jìn)程間如何通信
標(biāo)題URL:http://jinyejixie.com/article0/gpepoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、虛擬主機(jī)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、用戶體驗、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

保康县| 新闻| 武汉市| 平湖市| 嘉鱼县| 莫力| 普兰县| 安达市| 密云县| 莫力| 宜良县| 荥阳市| 彭泽县| 方正县| 呼玛县| 新龙县| 肇源县| 观塘区| 郯城县| 女性| 枞阳县| 河曲县| 阳西县| 贡山| 临沭县| 阳新县| 西昌市| 永清县| 醴陵市| 泌阳县| 景谷| 博野县| 霍林郭勒市| 荥经县| 内丘县| 满洲里市| 靖边县| 日喀则市| 大渡口区| 察隅县| 兴宁市|