首页 > 系统相关 >进程间通信和同步

进程间通信和同步

时间:2024-08-05 17:06:41浏览次数:14  
标签:同步 const int 间通信 mutex pthread 进程 cond sem

进程间通信

创建新IPC对象需指定的mode常值:

常值 说明
S_IRUSR/S_IWUSR 用户读/写
S_IRGRP/S_IWGRP 组成员读/写
S_IROTH/S_IWOTH 其他用户读/写

管道

  1. 无名管道,单向数据流,常用于父子进程间通信。
int pipe(int fd[2]);

该函数返回两个文件描述符:fd[0]读,fd[1]写,即半双工管道。

  1. FIFO,单向数据流,每个FIFO有一个路径名与之关联,允许无亲缘关系的进程访问同一个FIFO,也称为有名管道。
// pathname:路径名
// mode:文件权限位
int mkfifo(const char *pathname, mode_t mode);
  1. 管道和FIFO属性
  • 描述符可指定O_NONBLOCK标志

  • 请求读出的数据量多于管道或FIFO中可用数据量,只返回可用数据量

  • 请求写入的数据字节数小于或等于PIPE_BUF,那么write操作保证是原子

  • O_NONBLOCK标志的设置对write操作的原子性影响:
    待写字节小于PIPE_BUF时
    a. 管道或FIFO中空间足,那么所有数据字节都写入;
    b. 管道或FIFO中空间不足,立即返回EAGAIN错误;
    待写字节大于PIPE_BUF时
    c. 管道或FIFO至少有1字节空间,写入能容纳的数据字节,并返回实际写入的字节数;
    d. 管道或FIFO已满,立即返回EAGAIN错误。

  • 系统对管道和FIFO的限制:
    a. OPEN_MAX:一个进程在任意时刻打开的最大描述符数,可通过limit命令修改;
    b. PIPE_BUF:可原子地写往一个管道或FIFO的最大数据量。

消息队列

消息队列具有随内核的持续性。

// 创建或打开消息队列
//oflag参数是O_RDONLY、O_WRONLY或O_RDWR之一,可按位或上O_CREAT、O_EXCL或O_NONBLOCK
//创建新队列是需指定mode和attr参数
mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);
// 关闭消息队列,但依然存在于系统中
int mq_close(mqd_t mqdes);
// 减少引用计数,引用计数为0时会从系统删除消息队列
int mq_unlink(const char *name);
// 发送消息到队列,prio指定优先级,需小于MQ_PRIO_MAX
int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio);
// 从队列接收消息,priop传出参数,放置优先级
ssize_t mq_receive(mqd_t mqdes, char *ptr, size_t len, unsigned int *priop);
// 异步事件通知,产生一个信号或创建一个线程来执行一个指定的函数
int mq_notify(mqd_t mqdes, const struct sigevent *notification);

共享内存区

mmap函数把一个文件或共享内存区对象映射到调用进程的地址空间。使用该函数有三个目的:

  • 使用普通文件以提供内存映射I/O
  • 使用特殊文件以提供匿名内存映射
  • 使用shm_open以提供无亲缘关系进程间的共享内存区
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t len);
// 返回一个整数描述符,用作mmap的第五个参数
int shm_open(const char *name, int oflag, mode_t mode);
int shm_unlink(const char *name);
// 修改mmap后普通文件或共享内存区对象的大小
int ftruncate(int fd, off_t length);

同步

互斥锁

互斥锁静态分配static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;;动态分配调用pthread_mutex_init函数来初始化它。

int pthread_mutex_init(pthread_mutex_t *mptr, const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mptr);
int pthread_mutex_lock(pthread_mutex_t *mptr);
int pthread_mutex_trylock(pthread_mutex_t *mptr);
int pthread_mutex_unlock(pthread_mutex_t *mptr);

条件变量

int pthread_cond_init(pthread_cond_t *cptr, const pthread_condattr_t *attr);
int pthread_cond_destroy(pthread_cond_t *cptr);
int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);
// 唤醒一个线程
int pthread_cond_signal(pthread_cond_t *cptr);
// 唤醒全部线程
int pthread_cond_broadcast(pthread_cond_t *cptr);
// 到时唤醒
int pthread_cond_timewait(pthread_cond_t *cptr, pthread_mutex_t *mptr, const struct timespec *abstime);

信号量

  1. 有名信号量
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
int sem_close(sem_t *sem);
int sem_unlink(const char *name);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_getvalue(sem_t *sem, int *valp);
  1. 无名信号量,又叫内存信号量
// share为0,则在同一进程的各个线程间共享,否则进程间共享
int sem_init(sem_t *sem, int shared, unsigned int value);
int sem_destroy(sem_t *sem);

标签:同步,const,int,间通信,mutex,pthread,进程,cond,sem
From: https://www.cnblogs.com/songlh424/p/18341738

相关文章

  • ETL数据集成丨将GreenPlum数据同步至Doris数仓
    在当今数据驱动的时代,高效、可靠的数据集成成为企业数字化转型的关键一环。ETLCloud作为一款创新的数据集成平台,通过其强大的零代码配置能力,为企业提供了从数据抽取、转换到加载(ETL)的全链条解决方案,尤其在跨系统数据迁移方面展现出显著优势。本次实践通过将GreenPlum数据库的数据......
  • 无法加入进程,只能终止[Python 3.11,多处理]
    我有一个问题要问对Python的多处理库有更​​多经验的人,此时我几乎迷失了方向。我目前正在构建一个应该在Windows11和Windows11上运行的图像处理应用程序装有DebianLinux的OrangePi5。我的设置是,除了主程序之外,还有另外两个进程,一个用于处理不间断的......
  • 坚果云,文件夹同步冲突、共享文件夹权限提示文件已共享实际查看不到
    一、提示冲突打开注册表1、按下面的路径\HKEYLOCALMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager\看是否有【Nutstore-临时】开头的项和【Nutstore-通知】开头的项。如果有,删掉这两项就好了。2、重新同步文件夹就可以了二、共享文件夹权......
  • FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕
    1、什么是FIFO?        FIFO(FirstInFirstOut)是一种先进先出的数据缓存器,在逻辑设计里面用的非常多。它是一种存储器结构,被广泛应用于芯片设计中。FIFO由存储单元队列或阵列构成,第一个被写入队列的数据也是第一个从队列中读出的数据。        FIFO设计可......
  • 一直让 PHP 程序员懵逼的同步阻塞异步非阻塞,终于搞明白了
    大家好,我是码农先森。经常听到身边写Java、Go的朋友提到程序异步、非阻塞、线程、协程,让系统性能提高到百万、千万并发,使我甚是惊讶属实羡慕。对于常年写PHP的我来说,最初听到这几个词时,脑袋一直处于蒙圈状态,回过头来看着自己手上同步阻塞的PHP代码,心想着「异步、非阻塞、线......
  • 理解同步异步与阻塞非阻塞——傻傻分不清楚的终极指南
    同步异步与阻塞非阻塞这两组概念在IO场景下非常常见,由于他们在表现出来的效果上很相似,很容易造成混淆和困扰,要想理清楚这两组概念首先需要认识到这两组概念强调的是不同维度的事。同步异步强调的是两个操作之间的顺序关系,两个操作之间是有序的还是无序的;阻塞与非阻塞强调的是......
  • STM32H7 HAL库CubeMX 双重ADC模式同步采样详细配置+FFT计算相位差
    前言在电赛备赛期间琢磨了一下ADC同步采样的实现方式,本来是打算直接用AD7606来着,但是搞了半天也没把驱动整出来...考虑到AD7606本身采样率也拉不到太高,于是就花了几天时间把片上ADC配出来了。查资料的时候我发现关于STM32双重ADC模式的资料是真的少,用FFT算两路信号相位差的实例代......
  • 通过套接字将子进程输出按时间线逐行发送到前端失败
    这是我的代码:defenqueue_output(file,queue):forlineiniter(file.readline,''):queue.put(line)file.close()defread_popen_pipes(p):withThreadPoolExecutor(2)aspool:q_stdout,q_stderr=Queue(),Queue()......
  • java学习进程五
    本周所做的内容这一周我主要集中在以下几个方面的学习:基本数据类型与运算符:我复习了Java的基本数据类型(如int、double、char、boolean)和运算符(如算术运算符、关系运算符、逻辑运算符)。控制流语句:我学习了Java的控制流语句,包括条件语句(if-else、switch-case)和循环语句(for......
  • 使用标准的 window.location.href 实现页面跳转,如何解决导航栏和tab未同步更新的问题
    在某些情况下,当你使用​​window.location.href​​进行页面跳转时,导航栏和选项卡(tab)可能不会同步更新,导致用户体验不一致。要解决这个问题,可以采用以下几种方法:方法1:使用URL参数和JavaScript处理同步通过在URL中添加参数,来记录当前的导航状态和标签页状态,然后在页面......