首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 工作总结
  • 工作计划
  • 心得体会
  • 竞聘演讲
  • 会议发言
  • 爱国演讲
  • 就职演说
  • 开业开幕
  • 思想学习
  • 征文演讲
  • 经验材料
  • 述职报告
  • 调研报告
  • 工作汇报
  • 年终总结
  • 申报材料
  • 学习体会
  • 企划方案
  • 活动方案
  • 技巧经验
  • 模板范例
  • 思想宣传
  • 经济工作
  • 工作报告
  • 组织人事
  • 反腐倡廉
  • 慰问贺电
  • 先进事迹
  • 思想汇报
  • 入党申请书
  • 党会发言
  • 先进性教育
  • 入团申请书
  • 个人简历
  • 演讲稿
  • 调查报告
  • 实习报告
  • 和谐社会
  • 观后感
  • 读后感
  • 作文范文
  • 自我鉴定
  • 讲话稿
  • 自查报告
  • Linu进程间通信(2)实验报告

    时间:2020-09-11 11:39:28 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:进程 实验 通信

     实验六:Li nu x进程间通信(2)(4 课时) 实验目得:

     理解进程通信原理;掌握进程中信号量、共享内存、消息队列相关得函数得使用. 实验原理:

     Linux下进程通信相关函数除上次实验所用得几个还有:

     信号量

     信号量又称为信号灯,它就是用来协调不同进程间得数据对象得,而最主要得应用就是前一节得共享内存方式得进程间通信。要调用得第一个函数就是semget,用以获得一个信号量 ID。

     int s emg et t (key_t key, int nsems, int flag);

     key 就是 IPC 结构得关键字,flag 将来决定就是创建新得信号量集合,还就是引用一个现有得信号量集合。nsems 就是该集合中得信号量数。如果就是创建新 集合(一般在服务器中),则必须指定 nsems;如果就是引用一个现有得信号量集合(一般在客户机中)则将 nsems 指定为 0。

     s s em ctl 函数用来对信号量进行操作.

     int semctl (int semid, int semnum, int cmd, union semun arg);

     不同得操作就是通过 cmd 参数来实现得,在头文件 sem、h 中定义了7种不同得操作,实际编程时可以参照使用.

     semop 函数自动执行信号量集合上得操作数组。

     int semop(int semid, struct sembuf semoparray[], size_t nops);

     semoparray 就是一个指针,它指向一个信号量操作数组。nops 规定该数组中操作得数量. ftok 原型如下:

     key_t ftok( char * fname, int id )

     fname就就是指定得文件名(该文件必须就是存在而且可以访问得),id就是子序号, 虽然为 in t,但就是只有8个比特被使用(0—25 5)。

     当成功执行得时候,一个 key_t 值将会被返回,否则 -1 被返回。

     共享内存

     共享内存就是运行在同一台机器上得进程间通信最快得方式,因为数据不需要在不同得进程间复制.通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写.首先要用得函数就是shmget,它获得一个共享存储标识符.

     #include <sys/types、h>

     #include <sys/ipc、h>

     #include 〈sys/shm、h〉

     int shmget(key_t key, int size, int flag);

     当共享内存创建后,其余进程可以调用shmat()将其连接到自身得地址空间中。

     void *shmat(int shmid, void *addr, int flag);

     shmid为shmget函数返回得共享存储标识符,addr与flag参数决定了以什么方式来确定连接得地址,函数得返回值即就是该进程数据段所连接得实际地址,进程可以对此进程进行读写操作。

     断开共享内存连接:

     与 shmat函数相反,shmdt就是用来断开与共享内存附加点得地址,禁止本进程访问此片共享内存 函数原型 int shmdt(const void *shmaddr)

     函数传入值 shmaddr:连接得共享内存得起始地址 函数返回值 成功:0 出错:-1,错误原因存于 error 中 附加说明 本函数调用并不删除所指定得共享内存区,而只就是将先前用 shmat 函数连接(attach)好得共享内存脱离(detach)目前得进程 错误代码 EINVAL:无效得参数 shmaddr。

     消息队列

     消息队列就就是一个消息得链表。可以把消息瞧作一个记录,具有特定得格式以及特定得优先级. 1、创建新消息队列或取得已存在消息队列 原型:int msgget(key_t key, int msgflg); 参数:

     key:键值,可以指定,也可以由函数 ftok 生成。

     msgflg:IPC_CREAT 值,若没有该队列,则创建一个并返回新标识符;若已存在,则返回原标识符。

      IPC_EXCL 值,若没有该队列,则返回-1;若已存在,则返回0。

     2、向队列读/写消息 原型: msgrcv 从队列中取用消息:

     ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); msgsnd 将数据放到消息队列中:

     int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数:

     msqid:消息队列得标识码

     msgp:指向消息缓冲区得指针,此位置用来暂时存储发送与接收得消息

      msgsz:消息得大小。

     msgtyp:从消息队列内读取得消息形态.如果值为零,则表示消息队列中得所有消息都会被读取.

      msgflg:用来指明核心程序在队列没有数据得情况下所应采取得行动。

     3、设置消息队列属性 原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf ); 参数:msgctl 系统调用对 msgqid 标识得消息队列执行 cmd 操作,系统定义了 3 种 cmd 操作: IPC_STAT , IPC_SET , IPC_RMID

      IPC_STAT :

     该命令用来获取消息队列对应得 msqid_ds 数据结构,并将其保存到 buf 指定得地址空间。

      IPC_SET :

     该命令用来设置消息队列得属性,要设置得属性存储在buf 中。

     IPC_RMID : 从内核中删除 msqid 标识得消息队列。

     实验内容:

     1、 完成教材上信号量实例,想一下ftok函数得作用?修改例子,创建 2 个进程完成原来父子进程对应得操作. 子进程代码:

     #include<sys/types、h> #include<unistd、h> #include<stdio、h〉 #include〈stdlib、h> #include〈sys/types、h> #include<sys/sem、h> #include<sys/ipc、h> #define DELAY_TIME 3 union semun

     {

      ;lav tniﻩ struct semid_ds *buf;

      ;yarra* trohs dengisnuﻩ}; int init_sem(int sem_id,int init_value)

     {

      ;noinu_mes numes noinuﻩ sem_union、val = init_value;

     if(semctl(sem_id,0, SETVAL,sem_union)==—1)

     {

     ﻩ perror(”Initialize semaphore");

     ﻩ

     ;1— nruterﻩ

      }

      ;0 nruterﻩ} int del_sem(int sem_id)

     {

      ;noinu_mes numes noinuﻩ

     )1—==)noinu_mes,DIMR_CPI,0,di_mes(ltcmes(fiﻩ { ﻩ ﻩ perror(”Delete semaphore”);

      return -1;

     } ﻩ} int sem_p(int sem_id)

     {

      ;b_mes fubmes tcurtsﻩ sem_b、sem_num =0 ;

      ;1—= po_mes、b_mesﻩ sem_b、sem_flg=SEM_UNDO;

      )1—==)1,b_mes&,di_mes(pomes(fiﻩ {

     ﻩ

     ;)”noitarepo P"(rorrepﻩ ﻩ

     ;1- nruterﻩ }

     return 0; } int sem_v(int sem_id) {

     struct sembuf sem_b;

     sem_b、sem_num =0 ;

     sem_b、sem_op =1;

      ;ODNU_MES=glf_mes、b_mesﻩ if(semop(sem_id,&sem_b,1)==-1)

     {

      perror("V operation”);

     ;1— nruterﻩ }

      ;0 nruterﻩ} int main()

     {

      ;tluser t_dipﻩ int sem_id;

      ;)TAERC_CPI|6660,1,)'a',"、"(kotf(tegmes= di_mesﻩ

     ;)0,di_mes(mes_tiniﻩ

     ;)"n\、、、sdnoces emos rof tiaw lliw ssecorp dlihC”(ftnirpﻩ

     sleep(DELAY_TIME);

     ﻩ printf("The returned valud is %d in the child process(PID = %d)\n",result,getpid());

     ;)di_mes(v_mesﻩ} 等待进程:

     #include<sys/types、h> #include<unistd、h> #include〈stdio、h> #include<stdlib、h〉 #include〈sys/types、h〉 #include<sys/sem、h〉 #include<sys/ipc、h〉 #define DELAY_TIME 3 union semun{

      ;lav tniﻩ

     ;fub* sd_dimes tcurtsﻩ

     ;yarra* trohs dengisnuﻩ}; int init_sem(int sem_id,int init_value){

     union semun sem_union;

      ;eulav_tini = lav、noinu_mesﻩ if(semctl(sem_id,0, SETVAL,sem_union)==-1){

     ;)"erohpames ezilaitinI"(rorrepﻩ ﻩ return —1;

     } ﻩ

     ;0 nruterﻩ} int del_sem(int sem_id){

     union semun sem_union;

     if(semctl(sem_id,0,IPC_RMID,sem_union)==-1){

     ;)"erohpames eteleD"(rorrepﻩ ﻩ

     ;1- nruterﻩ } } int sem_p(int sem_id){

      ;b_mes fubmes tcurtsﻩ sem_b、sem_num =0 ;

     sem_b、sem_op =-1;

      ;ODNU_MES=glf_mes、b_mesﻩ

     {)1—==)1,b_mes&,di_mes(pomes(fiﻩ ﻩ

     ;)"noitarepo P"(rorrepﻩ ﻩ

     ;1— nruterﻩ

      } ﻩ

     ;0 nruterﻩ} int sem_v(int sem_id){

     struct sembuf sem_b;

      ; 0= mun_mes、b_mesﻩ

     ;1= po_mes、b_mesﻩ sem_b、sem_flg=SEM_UNDO;

      {)1—==)1,b_mes&,di_mes(pomes(fiﻩ

      ;)"noitarepo V"(rorrepﻩ

      ;1- nruterﻩ } ﻩ

     ;0 nruterﻩ} int main(){

      ;tluser t_dipﻩ int sem_id;

      ;)TAERC_CPI|6660,1,)"a","、”(kotf(tegmes= di_mesﻩ init_sem(sem_id,0);

      ;)di_mes(p_mesﻩ

     printf("The returned value is %d in the father process (PID =%d)\n",result,getpid());

     ﻩ sem_v(sem_id);

     ﻩ del_sem(sem_id); } 2、 完成教材上共享内存实例,查瞧运行情况。然后修改ftok 函数得参数,并编写两个进程完成实例原来得工作. 代码 :

     #include <sys/types、h> #include <sys/ipc、h〉 #include <sys/shm、h〉 #include <stdio、h〉 #include <stdlib、h> #include 〈string、h〉 #define BUFFER_SIZE 2048 int main(){

     pid_t pid;

     int shmid;

      ;rdda_mhs* rahcﻩ

     ;"ETORW" =][galf rahcﻩ ﻩ ;]EZIS_REFFUB[ffub rahcﻩ

     {)0〈))6660,EZIS_REFFUB,ETAVIRP_CPI(tegmhs = dimhs((fiﻩ

     perror(”shmget”);

     exit(1);

     } ﻩ else{

      printf("Create shared-memory: %d \n”,shmid);

     }

     ;)”m- scpi”(metsysﻩ pid = fork();

     if(pid==—1){

     ﻩ perror(”fork");

     ;)1(tixeﻩ}

     {)0 == dip(fi esleﻩ

      {)1-)*diov(==))0,0,dimhs(tamhs = rdda_mhs((fiﻩ ﻩ

      ;)”tamhs :dlihC”(rorrepﻩ

      exit(1);

     ﻩ }

     ﻩ

     {esleﻩ

      printf(”Child:Attach shared-memory:

     %p\n",shm_addr);

      }

      system("ipcs -m"); ﻩ ﻩ

      {)))galf(nelrts,galf,rdda_mhs(pmcnrts(elihwﻩ ﻩ

     printf("Child:

     Wait for enable data 、、、 \n");

     ﻩ

      ;)5(peelsﻩ

     } ﻩ

     ﻩ ﻩ strcpy(buff,shm_addr+strlen(flag));

     ﻩ ﻩ ;)ffub,"n\s%:yromem-derahS :lihC”(ftnirpﻩ ﻩ

     if((shmdt(shm_addr))<0){

     ﻩ

      ;)”tdmhs"(rorrepﻩ

     ﻩ exit(1);

      }

     ﻩ else{

     printf(”Child:

     Deattach shared—memory\n");

     ﻩ }

     ﻩ system("ipcs -m”); ﻩ ﻩ

     {)1- ==)LLUN,DIMR_CPI,dimhs(ltcmhs(fiﻩ

     ﻩ

     ;)"n\)DIMR_CPI(ltcmhs :

     dlihC"(rorrepﻩ

     ;)1(tixeﻩ ﻩ }

      else{

      ;)"n\yromem—derahs eteleD"(ftnirpﻩ

     }

      system("ipcs —m");

     }

     else{

     {)1—)*diov(==))0,0,dimhs(tamhs=rdda_mhs((fiﻩ

      perror("Parent:

     shmat");

     ﻩ

      ;)1(tixeﻩ ﻩ }

      else{

     ﻩ

      ;)rdda_mhs,"n\p% :yromem-derahs hcattA :tneraP”(ftnirpﻩ ﻩ }

     ;)1(peelsﻩ

     printf(”\n Input some string :\n");

     ﻩ

     ;)nidts,EZIS_REFFUB,ffub(stegfﻩ

      ;))ffub(nelrts,ffub,)galf( nelrts+rdda_mhs(ypcnrtsﻩ

      ;))galf(nelrts,galf,rdda_mhs(ypcnrtsﻩ

     if((shmdt(shm_addr))<0){

     ﻩ

     ;)"tdmhs :tneraP”(rorrepﻩ

     ﻩ

     ;)1(tixeﻩ ﻩ }

     ﻩ

     {esleﻩ ﻩ ﻩ

     ;)"n\yromem—derahs hcattaeD :tneraP”(ftnirpﻩ

     }

     ﻩ

     ;)"m— scpi"(metsysﻩ ﻩ

     ;)0,LLUN,dip(diptiawﻩ

     printf("Finished\n");

     }

      ;)0(tixeﻩ

     } 实验 总结: :

     自己写 自己写 自己写

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识