最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年05月07日 15:54:34   作者:net小伙  
這篇文章主要為大家詳細(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é)果?!?/strong>

要求:用大小為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 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;
}

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

相關(guān)文章

  • Centos7中添加、刪除Swap交換分區(qū)的方法

    Centos7中添加、刪除Swap交換分區(qū)的方法

    Swap空間的作用是當(dāng)系統(tǒng)的物理內(nèi)存不夠用的時(shí)候,就需要將物理內(nèi)存中的一部分空間釋放出來(lái),以供當(dāng)前運(yùn)行的程序使用。這篇文章主要給大家介紹了關(guān)于Centos7中添加、刪除Swap交換分區(qū)的相關(guān)資料,以及Centos7下增加swap分區(qū)大小的方法,需要的朋友可以參考下。
    2018-04-04
  • Linux中使用nfs共享存儲(chǔ)的方式

    Linux中使用nfs共享存儲(chǔ)的方式

    NFS是一種基于TCP/IP傳輸?shù)木W(wǎng)絡(luò)文件系統(tǒng)協(xié)議,通過(guò)使用NFS協(xié)議,客戶機(jī)可以像訪問(wèn)本地目錄一樣訪問(wèn)遠(yuǎn)程服務(wù)器中的共享資源,本文給大家介紹Linux中使用nfs共享存儲(chǔ)的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • 解決Linux中修改/etc/profile文件寫(xiě)錯(cuò)環(huán)境變量路徑導(dǎo)致系統(tǒng)命令找不到問(wèn)題

    解決Linux中修改/etc/profile文件寫(xiě)錯(cuò)環(huán)境變量路徑導(dǎo)致系統(tǒng)命令找不到問(wèn)題

    這篇文章主要介紹了解決Linux中修改/etc/profile文件寫(xiě)錯(cuò)環(huán)境變量路徑導(dǎo)致系統(tǒng)命令找不到問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Linux下安裝jdk1.8并配置環(huán)境變量的教程

    Linux下安裝jdk1.8并配置環(huán)境變量的教程

    這篇文章主要介紹了Linux下安裝jdk1.8并配置環(huán)境變量的教程,需要的朋友可以參考下
    2018-03-03
  • 3分鐘學(xué)會(huì)如何上手supervisor看門(mén)狗

    3分鐘學(xué)會(huì)如何上手supervisor看門(mén)狗

    這篇文章主要介紹了3分鐘學(xué)會(huì)如何上手supervisor看門(mén)狗,文章中操作步驟講解的很清楚,有需要的同學(xué)可以研究下
    2021-02-02
  • Linux堆內(nèi)存修改及清理命令方式

    Linux堆內(nèi)存修改及清理命令方式

    這篇文章主要介紹了Linux堆內(nèi)存修改及清理命令方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • linux托盤(pán)不斷閃爍之解決方法

    linux托盤(pán)不斷閃爍之解決方法

    紅旗6sp1雖然升級(jí)了一些配置和軟件,但是也出現(xiàn)很多問(wèn)題 比較突出的就是 當(dāng)通過(guò) 網(wǎng)絡(luò) 設(shè)置 一個(gè)pppoe adsl 上網(wǎng)以后,系統(tǒng)托盤(pán)不停的閃爍
    2008-07-07
  • linux 配置本地yum源,配置國(guó)內(nèi)yum源,配置epel源的步驟

    linux 配置本地yum源,配置國(guó)內(nèi)yum源,配置epel源的步驟

    這篇文章主要介紹了linux 配置本地yum源,配置國(guó)內(nèi)yum源,配置epel源的步驟,幫助大家更好的配置服務(wù)器,感興趣的朋友可以了解下
    2020-12-12
  • 限制 Apache日志文件大小的方法

    限制 Apache日志文件大小的方法

    access.log,件在 WEB 服務(wù)器運(yùn)行一段時(shí)間之后會(huì)達(dá)到幾十兆甚至上百兆,如果Apache運(yùn)行有錯(cuò)誤,error.log也會(huì)增大到幾十兆,我們知道系統(tǒng)讀寫(xiě)一個(gè)大的文本文件是非常耗內(nèi)存的,因此限定日志文件大小十分必要。
    2009-04-04
  • 阿里云 ubuntu16.04搭建IPSec服務(wù)

    阿里云 ubuntu16.04搭建IPSec服務(wù)

    IPSec是一組基于網(wǎng)絡(luò)層的,應(yīng)用密碼學(xué)的安全通信協(xié)議族,這篇文章主要介紹了阿里云 ubuntu16.04搭建IPSec服務(wù),需要的朋友可以參考下
    2019-11-11

最新評(píng)論

甘肃省| 靖远县| 手游| 西和县| 济南市| 武宣县| 内江市| 论坛| 张掖市| 遂溪县| 当涂县| 射阳县| 梨树县| 区。| 梁河县| 平江县| 丰县| 图木舒克市| 周至县| 灌阳县| 鄂尔多斯市| 衡水市| 锦屏县| 横峰县| 方正县| 柳州市| 平谷区| 泰顺县| 陇西县| 嵊泗县| 湘潭县| 金昌市| 昌黎县| 东安县| 台北市| 冀州市| 如东县| 奉新县| 志丹县| 斗六市| 且末县|