前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux进程间的通信

Linux进程间的通信

作者头像
心跳包
发布2020-08-31 10:31:11
2K0
发布2020-08-31 10:31:11
举报

进程间的通信有管道、信号、消息队列、信号量、共享内存、套接字等。

一、管道通信

管道通信方式分为无名管道和有名管道,无名通道可用于有亲缘关系进程间的通信,有名通道克服了管道没有名字的限制。

管道具有以下特点:

1.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立两个管道。

2.只能由于父子进程或者兄弟进程之间

3.单独过程一种独立的文件系统

4.数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在 管道缓冲区的末尾,并且每次都是从缓冲区头部读出数据。

相关函数

mkfifo、popen、read、write、fork

表头文件

#include<unistd.h>

定义函数

int pipe(int filedes[2])

函数说明

pipe()会建立管道,并将文件描述由参数fileds数组返回。filedes[0]为管道的读取端,filedes[1]则为管道的写入端。

返回值

若成功则返回0,否则返回-1;,错误原因在errno中

错误代码

EMFILE:进程已用文件描述符最大量 ENFILE:系统已无文件描述符可用 EFAULT:参数filedes数组地址不合法

  • EMFILE:进程已用文件描述符最大量
  • ENFILE:系统已无文件描述符可用
  • EFAULT:参数filedes数组地址不合法
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int filedes[2];
	char buffer[80];
	
	pipe(filedes);
	if(fork()>0)
	{
		/*父进程*/
		char s[] = "hello!\n";
		write(filedes[1],s,sizeof(s));
	}
	else
	{
		/*子进程*/
		read(filedes[0],buffer,80);
		printf("%s",buffer);
	}	
}

读写无名管道

二、信号量

信号量是一个计数器,可以用来控制多个进程对共享资源的访问,常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,在任一时刻只能有一个执行线程访问代码的临界区域,临界区域是指执行数据更新的代码需要独占式的执行,而信号量则可以提供这种访问机制,让临界区同一事件只有一个线程在访问。

三、消息队列

消息队列(message queue)

消息队列是由消息的链表,存放在内核中并有消息队列标识符的标识。克服了信号量传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

四、信号

信号是一种比较复杂的通信方式,用来通知接收进程某个事件已经发生。

五、

共享内存(shared memory)

映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。是最快的IPC(进程间通信)方式,是针对其他进程间通信方式运行效率低而专门设计的,往往与信号量配合使用,实现进程间的同步和通信。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档