Linux_进程间通讯方式

管道

  • 有名管道:在磁盘上有一个文件标识,创建管道文件,但是交互的数据并不会存储到磁盘中,管道文件不会占据磁盘空间。有名管道没有在磁盘上存真正的信息,而是在内存中存放,2个进程结束后自动丢失,通信结束后有名管道的文件路径本身存在,这是和无名管道区别的地方。
  • 无名管道:首先创建一个管道文件,无名管道是一种特殊类型的文件,在内核空间中对应的资源即是一段内存空间,内核在这段空间以循环对列的方式临时存入一个进程发送给另一个进程的信息,这段内核空间完全由操作系统管理和维护,应用程序只需要,也只能通过系统调用来访它。
//无名管道代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

int main()
{
	int fds[2] = {-1, -1};
	
	int res = pipe(fds);  //创建管道, fds[0]  读端    fds[1] 写端
	assert(-1 != res);

	pid_t n = fork();
	assert(-1 != n);

	if(0 == n) //子进程负责读,所以要关闭写端
	{
		close(fds[1]);
		while(1)
		{
			char readbuff[128] = { 0 };
			int n = read(fds[0], readbuff, 127);

			if(n < 0 || 0 == strncmp(readbuff, "end", 3))
			{
				break;
			}
			printf("child: %s\n", readbuff);
		}
		close(fds[0]);
	}
	else  //父进程负责写,因此要先关闭读端
	{
		close(fds[0]);
		while(1)
		{
			printf("plese input\n");
			char writebuff[128] = { 0 };
			fgets(writebuff, 128, stdin);
			
			write(fds[1], writebuff, strlen(writebuff) - 1);
			if(0 == strncmp(writebuff, "end", 3))
			{
				break;
			}
		}
		close(fds[1]);
	}
	return 0;
}

信号

信号量

信号量类似于一个计数器,当信号量的值大于0时,记录临界资源的个数,当信号量等于时,进程访问临界资源时必须阻塞。

消息队列

共享内存

共享内存是通过内核对象,将多个进程中的一个虚拟地址映射到内核对象所申请的一块物理内存上,从而实现进程间数据的通讯。
如图所示:

  • 步骤:
    1. 创建内核对象,并且申请物理内存。
    2. 链接,即各进程通过虚拟地址映射到同一物理内存上。
    3. 通过ptra,ptrb分别访问这块物理内存。

socket套接字

socket通过TCP传输,UDP传输

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值