Linux进程间的通信

时间:2022-07-24
本文章向大家介绍Linux进程间的通信,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

一、管道通信

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

管道具有以下特点:

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(进程间通信)方式,是针对其他进程间通信方式运行效率低而专门设计的,往往与信号量配合使用,实现进程间的同步和通信。