当前位置: 首页 > news >正文

实验二 进程通信

实验二 进程通信

一.试验目的

a.程通信原理和基本技术

b.解linux系统进程间通信机构(IPC);

c.linux关于共享内存的概念;

d.linux支持进程间共享内存的系统调用;

e.进程同步概念。

二验内容与要求

(一)闹钟。用c语言编程,实现进程间通过信号进行通信。

用fork()创建两个进程,子进程在等待5秒后用系统调用kill()向父进程发送SIGALRM信号,父进程用系统调用signal()捕捉SIGALRM信号。

二)共享内存。实现利用共享内存机制的生产者/消费者问题的解决方案。生产者将数据写入共享内存。消费者从共享内存取出数据,在屏幕输出。参考如下程序:

执行内容说明:

1、首先调用shmget()函数建立一块共享内存,大小为1024个字节,该函数返回创建

的共享内存标识符。

2、然后调用fork()产生一个子进程(生产者进程)。子进程调用shmat()函数将该共享内存链接(attach)到自己的虚存空间,即可通过普通的内存写操作(例如strcpy等),在该共享内存写入数据。

3、写完数据后,子进程调用shmdt()函数断开与该共享内存的连接。

4、父进程sleep,直到子进程完成上述操作。父进程(消费者)调用shmctl()函数得到关于这块共享内存的相关消息,并打印出来。

5、父进程调用shmat()函数将这块共享内存连接到自己的虚存空间,即可以通过普通的内存读操作(例如printf等),将该共享内存中的字符串读出来。

6、读完数据后,父进程调用shmdt()函数断开与该内存的连接。

7、最后,父进程调用shmctl()函数,销毁该共享内存。

三验步骤

(一)闹钟

        1.打开终端,创建clock.文件。如图1,图2

                                           图1

                                           图2

2.编译程序,如图3

                                                                图3

3.运行程序,如图4

                                                                       图4

(二)共享内存

1.打开终端,创建sharestorage.c文件如图5,图6

                                          图5

图6

2.编译程序,如图7

图7

3.运行程序,如图8

                                                               图8

四.程序清单:注意加注释(包含关键字、方法、变量等),在每个模块前加注释

  • 闹钟。

#include <signal.h>

#include <stdio.h>

#include <unistd.h>

static int alarm_fired = 0;            //闹钟未设置

//模拟闹钟

void ding(int sig)

{

       alarm_fired = 1;               //设置闹钟

}

int main()

{

       int pid;

       printf("alarm application starting\n");

       if((pid = fork( )) == 0)

       {     //子进程5秒后发送信号SIGALRM给父进程

              sleep(5);

              kill(getppid(), SIGALRM);

              //exit(0);

return 0;

       }

//父进程安排好捕捉到SIGALRM信号后执行ding函数

       printf("waiting for alarm to go off\n");

       (void) signal(SIGALRM, ding);

       pause();           //挂起父进程,直到有一个信号出现

       if (alarm_fired)

              printf("Ding!\n");

       printf("done\n");

       //exit(0);

return 0;

}

  • 共享内存。

#include<unistd.h>

#include<sys/ipc.h>

#include<sys/shm.h>

#include<errno.h>

#include <stdio.h>

#include <string.h>

#define KEY 1234                              /*键*/

#define SIZE 1024                             /*欲建立的共享内存的大小*/

int main()

{

  int shmid;

  char *shmaddr;

  struct shmid_ds buf;

  shmid=shmget(KEY,SIZE,IPC_CREAT|0600);         /*建立共享内存*/

  if(shmid==-1)

  {

         printf("create share memory failed:%s",strerror(errno));

         return 0;

  }

  if(fork( )==0)

  {                                   /*子进程*/

         sleep(2);

         shmaddr=(char*)shmat(shmid,NULL,0);   /*系统自动选择一个地址连接*/

         if(shmaddr==(void*)-1)

         {

                printf("connect to the share memory failed:%s",strerror(errno));

                return 0;

         }

         /*向共享内存内写数据*/

         strcpy(shmaddr,"hello,this is shared data.\n");

         shmdt(shmaddr);                            /*断开共享内存*/

         //exit(0);

         return 0;

  }else

  {                                          /*父进程*/

         wait(0);         

         shmctl(shmid,IPC_STAT,&buf);     /*取得共享内存的相关信息*/

         printf("size of the share memory: shm_segsz=%dbytes\n",buf.shm_segsz);

         printf("process id of the creator:shm_cpid=%d\n",buf.shm_cpid);

         printf("process id of the last operator:shm_lpid=%d\n",buf.shm_lpid);

         shmaddr=(char*)shmat(shmid,NULL,0);      /*系统自动选择一个地址连接*/

         if(shmaddr==(void*)-1)

         {

                printf("connect the share memory failed:%s",strerror(errno));

                return 0;

         }

         printf("print the content of the share memory:");

         printf("%s\n",shmaddr);

         shmdt(shmaddr);                           /*断开共享内存*/

         /*当不再有任何其它进程使用该共享内存时系统将自动销毁它*/

         shmctl(shmid,IPC_RMID,NULL);

  }

}

五.测试结果(运行结果、结果分析)

1.闹钟程序实验结果如下

                                                 闹钟程序实验结果

2.共享内存程序实验结果如下

                                                 共享内存程序实验结果

六.总结(实验效果分析、心得体会,遗留问题)

通过这次实验我理解进程通信原理和基本技术,了解linux系统进程间通信机构(IPC),知道了linux关于共享内存的概念,了解了linux支持进程间共享内存的系统调用,巩固进程同步概念。同时我也明白了实际操作之前把理论知识学好在实验中才能得心应手,虽然会遇到各种问题但还是能通过知识解决问题。今后还是认真听讲该科目的内容。

相关文章:

  • CVPR2025 | AnyAttack:对任意图像的视觉语言模型的目标性对抗攻击
  • 实现拖拽图片验证的基本步骤
  • vulhub Matrix-Breakout
  • Ai知识库私有化部署
  • Android Launcher3 首屏图标锁定技术方案解析
  • What a code!
  • 网格交易中倍数委托的实现方法
  • 软考程序员考试知识点汇总
  • 华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT
  • 漏洞知识点《Tornado框架中RequestHandler的对象》
  • 英语词性--连词
  • Model Context Protocol - Prompts
  • 智慧楼宇:科技编织的未来生活图景
  • dart学习记录3(函数)
  • 三.ffmpeg对yuv的操作
  • SSH连接中断原因分析(SSH断开、SSH中断、SSH连接断开、远程断开、远程中断)(带宽不足、网络抖动与丢包、CPU资源耗尽、内存不足、磁盘I/O瓶颈)
  • 解锁物联网高效开发,Synaptics SYN43756E Wi-Fi 6E 芯片登场
  • 打造无缝智慧照明场景,涂鸦智能全新发布蓝牙Mesh照明解决方案
  • AI Agent系列(六) -基于ReAct架构搭建LLM Agent(Deepseek)
  • C语言中的函数
  • 重庆荣昌区委区政府再设“答谢宴”,邀请800余名志愿者机关食堂用餐
  • 网络主播直播泄机密,别让这些“小事”成威胁国家安全的“突破口”
  • 国家主席习近平会见斯洛伐克总理菲佐
  • 马云再次现身阿里打卡创业公寓“湖畔小屋”,鼓励员工坚持创业精神
  • “毛茸茸”的画,诗意、温暖又治愈
  • 一企业采购国产化肥冒充“挪威化肥”:7人被抓获