C语言实现进程间通信原理解析

 更新时间:2020年06月15日 16:05:29   投稿:yaominghui  
这篇文章主要介绍了C语言实现进程间通信原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

最近学习了操作系统的并发;以下是关于进程间实现并发,通信的两个方法。

1:利用管道进行进程间的通信

用到下列函数

  • pipe() from unistd.h
  • sleep()
  • write(), read()
  • fork(); //创建子进程

管道只能用于具有亲缘关系的进程,可以将其看作一个文件,但有别于普通的文件, 管道一次只可以被一个进程访问,能实现互斥;

pipe(int fd[] ), 其参数为长度为2的int数组,分别代表读端fd[0], 写端fd[1], 在创建管道后,f d[0],fd[1]成为文件描述符;

写入(write)管道一端fd[1]的数据,在管道的另一端fd[0]可以被进程读取(read);

代码

2:利用共享内存实现通信, 信号量实现互斥

共享内存使用了以下函数:

int shm_open(const char *name, int oflag, mode_t mode);  //创建或打开共享内存, 返回文件描述符

int ftruncate(int fd, off_t FILE_SIZE);  //调整共享内存空间大小

void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) //将文件映射到进程的地址空间,返回指向地址空间的指针

int munmap(void *start, size_t length); //解除地址映射

int shm_unlink(const char *name); //删除shm_open()创建的共享内存

函数具体用法,可见链接,讲述的很详细了;

具体思路:

一:实现进程间的通信,无非就是各进程间数据的交流,传输;

1、shm_open()函数是创建或打开一个已存在(唯一的name)的共享内存,返回文件描述符,可以看作是创建或打开了一个文件,说法不同而已

2、ftruncate()函数用于指定文件(fd)有多大

3、关键步骤就是mmap(),它将指定的文件(fd)或其他对象映射到内存, 得到可以直接操作的指针对象,不需调用write, read等

4、然后就是在使用完成后需要解除映射munmap(), 和删除创建的共享内存(name)shm_unlink(),; 对于做打开共享内存操作的进程,也需要执行这些操作(1,2,3,4)

二:然后使用信号量实现互斥:

互斥的意思为:当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源

临界区代表进程将访问共享资源的一段代码

当我们在向共享区写入数据时,显然不想多个进程同时访问,因为会造成不必要的麻烦,就需要信号量来实现这种互斥的机制

sem_t *sem_open(const char *name,int oflag, mode_t mode,unsigned int value)  //创建或打开一个存在的(name)信号量

int sem_wait(sem_t *sem) // 使信号量(value)减1,若信号量小于0,则阻塞执行semwait()的进程

临界区代码一般存在于这两个调用之间,比如:当前进程向共享区写数据,如受到sem_wait阻塞,表示资源已经用尽或其他进程正在访问,需等待

int sem_post(sem_t *sem) // 当前进程离开临界区时,使信号量(value)加1,

int sem_unlink(count char *name) //删除信号量

函数具体用法,可见链接,讲述的很详细了;

代码

需要注意的是:

1:在使用共享内存和信号量时要注意,有些调用是使用的共享内存和信号量的name, 但有些是使用的创建或打开他们的返回值(fd和sem_t*)

2:如在子进程创建之前,父进程已创建了共享内存或信号量,则子进程无需在进行打开操作,可直接使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言中压缩字符串的简单算法小结

    C语言中压缩字符串的简单算法小结

    这篇文章主要介绍了C语言中可用于实现字符串压缩的简单算法小结,列举了包括哈夫曼算法等三个核心的程序实现算法,需要的朋友可以参考下
    2016-03-03
  • C++ OpenCV模拟实现微信跳一跳

    C++ OpenCV模拟实现微信跳一跳

    这篇文章主要介绍了使用C++和OpenCV模拟实现微信跳一跳功能,本文图文并茂通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 带你从头学习C++的封装

    带你从头学习C++的封装

    这篇文章主要为大家从头学习了C++的封装,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • c++实现跳跃表(Skip List)的方法示例

    c++实现跳跃表(Skip List)的方法示例

    跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入、删除、查找的复杂度均为O(logN),下面这篇文章主要介绍了c++实现跳跃表(Skip List)的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-09-09
  • C++ DLL实现循环播放音乐的示例详解

    C++ DLL实现循环播放音乐的示例详解

    这篇文章主要为大家详细介绍了C++ DLL实现循环播放音乐的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2024-03-03
  • 解析bitmap处理海量数据及其实现方法分析

    解析bitmap处理海量数据及其实现方法分析

    本篇文章是对bitmap处理海量数据及其实现的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • QT中QTableWidget加载大量数据不卡顿的解决

    QT中QTableWidget加载大量数据不卡顿的解决

    本文主要介绍了QT中QTableWidget加载大量数据不卡顿的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • VC++基于Dx实现的截图程序示例代码

    VC++基于Dx实现的截图程序示例代码

    这篇文章主要介绍了VC++基于Dx实现的截图程序示例代码,比较实用的功能,需要的朋友可以参考下
    2014-07-07
  • C语言举例讲解转义字符的使用

    C语言举例讲解转义字符的使用

    转义字符是很多程序语言、数据格式和通信协议的形式文法的一部分。对于一个给定的字母表,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现(没有转义字符开头)时的语义。因此转义字符开头的字符序列被叫做转义序列
    2022-05-05
  • Qt自定义控件实现进度仪表盘

    Qt自定义控件实现进度仪表盘

    这篇文章主要介绍了Qt自定义控件实现进度仪表盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12

最新评论