`
weiyuhu
  • 浏览: 235842 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

linux进程通信(四)--共享内存+信号量

阅读更多
   1. /*server.c:向共享内存中写入People*/  
   2. #include <stdio.h>  
   3. #include <sys/types.h>  
   4. #include <sys/ipc.h>  
   5. #include <sys/sem.h>  
   6.   
   7. int main()  
   8. {  
   9.     struct People{  
  10.         char name[10];  
  11.         int age;  
  12.     };  
  13.       
  14.     int semid;  
  15.     int shmid;  
  16.     key_t semkey;  
  17.     key_t shmkey;  
  18.     semkey=ftok("server.c",0);  
  19.     shmkey=ftok("client.c",0);  
  20.       
  21.     /*创建共享内存和信号量的IPC*/  
  22.     semid=semget(semkey,1,0666|IPC_CREAT);  
  23.     if(semid==-1)  
  24.     printf("creat sem is fail\n");  
  25.     shmid=shmget(shmkey,1024,0666|IPC_CREAT);  
  26.     if(shmid==-1)  
  27.     printf("creat shm is fail\n");  
  28.       
  29.     /*设置信号量的初始值,就是资源个数*/  
  30.     union semun{  
  31.         int val;  
  32.         struct semid_ds *buf;  
  33.         ushort *array;  
  34.     }sem_u;  
  35.       
  36.     sem_u.val=1;  
  37.     semctl(semid,0,SETVAL,sem_u);  
  38.       
  39.     /*将共享内存映射到当前进程的地址中,之后直接对进程中的地址addr操作就是对共享内存操作*/  
  40.       
  41.     struct People * addr;  
  42.     addr=(struct People*)shmat(shmid,0,0);  
  43.     if(addr==(struct People*)-1)  
  44.     printf("shm shmat is fail\n");  
  45.       
  46.     /*信号量的P操作*/  
  47.     void p()  
  48.     {  
  49.         struct sembuf sem_p;  
  50.         sem_p.sem_num=0;  
  51.         sem_p.sem_op=-1;  
  52.         if(semop(semid,&sem_p,1)==-1)  
  53.         printf("p operation is fail\n");          
  54.     }  
  55.   
  56.     /*信号量的V操作*/  
  57.     void v()  
  58.     {  
  59.         struct sembuf sem_v;  
  60.         sem_v.sem_num=0;  
  61.         sem_v.sem_op=1;  
  62.         if(semop(semid,&sem_v,1)==-1)  
  63.         printf("v operation is fail\n");  
  64.     }  
  65.       
  66.     /*向共享内存写入数据*/  
  67.     p();  
  68.     strcpy((*addr).name,"xiaoming");  
  69. /* 注意:①此处只能给指针指向的地址直接赋值,不能在定义一个  struct People people_1;addr=&people_1; 因为addr在addr=(struct People*)shmat(shmid,0,0);时,已经由系统自动分配了一个地址,这个地址与共享内存相关联,所以不能改变这个指针的指向,否则他将不指向共享内存,无法完成通信了。 
  70. 注意:②给字符数组赋值的方法。刚才太虎了。。*/  
  71.     (*addr).age=10;  
  72.     v();  
  73.       
  74.     /*将共享内存与当前进程断开*/  
  75.     if(shmdt(addr)==-1)  
  76.     printf("shmdt is fail\n");    
  77.       
  78. }  




   1. /*client.c:从共享内存中读出People*/  
   2. #include <stdio.h>  
   3. #include <sys/types.h>  
   4. #include <sys/ipc.h>  
   5. #include <sys/sem.h>  
   6.   
   7. int main()  
   8. {  
   9.     int semid;  
  10.     int shmid;  
  11.     key_t semkey;  
  12.     key_t shmkey;  
  13.     semkey=ftok("server.c",0);  
  14.     shmkey=ftok("client.c",0);  
  15.       
  16.     struct People{  
  17.         char name[10];  
  18.         int age;  
  19.     };  
  20.   
  21.     /*读取共享内存和信号量的IPC*/    
  22.     semid=semget(semkey,0,0666);  
  23.     if(semid==-1)  
  24.     printf("creat sem is fail\n");  
  25.     shmid=shmget(shmkey,0,0666);  
  26.     if(shmid==-1)  
  27.     printf("creat shm is fail\n");  
  28.       
  29.     /*将共享内存映射到当前进程的地址中,之后直接对进程中的地址addr操作就是对共享内存操作*/  
  30.     struct People * addr;  
  31.     addr=(struct People*)shmat(shmid,0,0);  
  32.     if(addr==(struct People*)-1)  
  33.     printf("shm shmat is fail\n");  
  34.       
  35.     /*信号量的P操作*/  
  36.     void p()  
  37.     {  
  38.         struct sembuf sem_p;  
  39.         sem_p.sem_num=0;  
  40.         sem_p.sem_op=-1;  
  41.         if(semop(semid,&sem_p,1)==-1)  
  42.         printf("p operation is fail\n");          
  43.     }  
  44.       
  45.     /*信号量的V操作*/  
  46.     void v()  
  47.     {  
  48.         struct sembuf sem_v;  
  49.         sem_v.sem_num=0;  
  50.         sem_v.sem_op=1;  
  51.         if(semop(semid,&sem_v,1)==-1)  
  52.         printf("v operation is fail\n");  
  53.     }  
  54.       
  55.     /*从共享内存读出数据*/  
  56.     p();  
  57.     printf("name:%s\n",addr->name);  
  58.     printf("age:%d\n",addr->age);  
  59.     v();  
  60.       
  61.     /*将共享内存与当前进程断开*/  
  62.     if(shmdt(addr)==-1)  
  63.     printf("shmdt is fail\n");  
  64.       
  65.     /*IPC必须显示删除。否则会一直留存在系统中*/  
  66.     if(semctl(semid,0,IPC_RMID,0)==-1)  
  67.     printf("semctl delete error\n");  
  68.     if(shmctl(shmid,IPC_RMID,NULL)==-1)  
  69.     printf("shmctl delete error\n");  
  70. }  


分享到:
评论

相关推荐

    Linux多进程通信-信号量,共享内存示例

    本示例通过信号量和共享内存这两种IPC机制,展示了如何在多个进程中有效地协同工作。信号量用于同步对共享资源的访问,而共享内存则提供了进程间直接读写的共享数据区域。 信号量是一种同步机制,它是一个整型变量...

    linux下共享内存+信号量

    linux下共享内存+信号量,不会出奇怪的错误,如信号量和共享内存未清,导致无法再次运行,ctrl+c后能够正常清除信号量及共享内存。

    使用共享内存及信号量实现进程间通信例子

    本示例代码着重于使用共享内存和信号量来解决进程间的通信和同步问题,这是一种高效且灵活的方法,特别是在多处理器和多线程环境中。下面我们将详细探讨这些概念以及它们在Linux系统中的实现。 **共享内存** 是一种...

    【LINUX实时聊天室--原创可修改 95+】linux实时聊天系统(原创)进程间通信

    常见的IPC机制包括管道(pipe)、消息队列、共享内存、信号量、套接字等。在这个项目中,作者可能使用了其中的一种或多种来确保数据的高效传输和同步。 2. **网络编程**:聊天系统通常基于TCP/IP协议栈工作,因此...

    Linux进程间通信-信号量通信进程互斥实例.pdf

    本实例通过信号量实现了Linux进程间的互斥通信,展示了如何利用信号量控制并发进程对共享资源的访问。这种机制对于多线程或多进程环境中的资源管理至关重要,可以有效地防止数据竞争,确保程序的正确性。同时,这个...

    Linux 下C++共享内存、信号量封装,实现进程同步

    Linux 下C++共享内存、信号量封装,实现进程同步

    linux无亲缘关系进程间通信(互斥锁+条件变量+共享内存)

    本示例中提到的“linux无亲缘关系进程间通信”着重讲解了如何利用互斥锁(Mutex)、条件变量(Condition Variable)以及共享内存(Shared Memory)这三种机制来实现非父子进程间的同步通信。 1. **互斥锁**:互斥锁...

    实验二、进程通信-管道及共享内存 实验报告

    【实验二、进程通信-管道及共享内存 实验报告】 本次实验主要涵盖了操作系统中的两个重要概念:进程通信和共享内存,旨在深入理解这两个概念及其在实际编程中的应用。实验包括了对管道通信的分析和实践,以及对共享...

    linux无亲缘关系间进程同步通信实现(互斥锁+条件变量+共享内存模式)

    总结来说,互斥锁、条件变量和共享内存是Linux下实现进程间通信的关键工具,它们共同确保了多进程环境下的数据安全和程序的正确执行。通过合理地使用这些工具,开发者能够构建出高效且可靠的多进程应用程序。在实际...

    linux系统编程--进程间通信--管道

    常用的进程间通信方式有多种,包括无名管道、有名管道、信号、System V IPC 对象共享内存、消息队列和信号灯、BSD 套接字等。 本文主要介绍无名管道(pipe)的概念和使用方法。无名管道是一种半双工的通信方式,...

    进程间通讯---共享内存的使用方法

    为了同步多个进程对共享内存的访问,还可以结合信号量或者互斥锁等同步机制。 总结起来,共享内存是一种强大的进程间通信机制,适用于需要高速数据交换的场景。在C语言中,利用POSIX API可以方便地创建、映射和管理...

    共享内存+互斥量实现linux进程间通信.pdf

    共享内存+互斥量实现Linux进程间通信 一、共享内存简介 共享内存是一种高效方便的进程间通信方式,它允许两个或更多进程访问同一块内存。共享内存并未提供进程同步机制,使用共享内存完成进程间通信时,需要借助...

    Linux进程间通信(消息队列、信号量+共享内存).zip

    在这个“Linux进程间通信(消息队列、信号量+共享内存).zip”压缩包中,我们可以看到涉及到Linux IPC的三种主要方法:消息队列、信号量以及共享内存。这些技术在实现分布式锁和信号量控制等方面有着广泛的应用。 1...

    Linux课件之7信号量、共享内存和消息队列.ppt

    Linux中的System V Interprocess Communication (IPC) 是一种进程间通信机制,它提供了三种主要的工具:信号量、共享内存和消息队列。这些机制允许不同的进程之间有效地协调和交换信息,是多线程和多进程应用程序中...

    linux进程间通信--IPC

    在Linux环境下,进程间通信支持多种机制,包括但不限于管道、有名管道、信号量、消息队列、共享内存、信号以及套接字等。每种通信方式都有其特定的应用场景和优势。 #### 管道 管道是一种半双工的通信方式,意味着...

    Linux进程间通信-信号量通信进程同步实例.pdf

    本文将深入探讨Linux系统中的一个特定IPC机制——信号量(Semaphore)及其在进程同步中的应用。信号量是一种用于控制多个进程对共享资源访问的同步工具,它能有效地防止竞态条件和死锁的发生。 信号量是一个整数值...

    Linux进程间通信之共享内存

    Linux进程间通信的共享内存是一种高效的数据交换方式,但是对共享内存的访问同步控制需要程序员自己实现,这是在使用共享内存时需要注意的问题。通过上述步骤和示例程序的学习,我们可以更好地理解共享内存的工作...

    linux c 进程间通信(共享内存+消息队列)

    **共享内存**是Linux进程间通信的一种高效方式,它允许不同的进程直接访问同一块内存空间。在C语言中,可以使用`&lt;sys/shm.h&gt;`头文件中的函数来操作共享内存。创建共享内存的关键步骤包括: 1. **创建共享内存**:...

    Linux进程间通信-信号通信信号发送实例.pdf

    在实际应用中,信号通信可以结合其他IPC机制,如管道、共享内存、消息队列等,以实现更复杂的数据交换和进程协作。在编程时,需要注意信号处理的正确性和一致性,以防止因信号处理不当导致的程序异常。 参考文献: ...

    Linux进程间通信-信号通信定时信号实例.pdf

    在实际开发中,信号通信可以与其他IPC机制(如管道、共享内存、消息队列等)结合使用,以实现更复杂的进程间协作。 参考文献: [1] 刘志强,《基于项目驱动的嵌入式Linux应用设计开发》,清华大学出版社。这本书...

Global site tag (gtag.js) - Google Analytics