【Linux】进程间通信,超详解!

本文详细介绍了Linux系统中的进程间通信,包括管道(匿名管道和命名管道)、共享内存、消息队列和信号量的概念、使用方法和特点。通过实例代码演示了各种通信方式的实现过程,强调了进程通信的重要性及其在系统中的应用。
摘要由CSDN通过智能技术生成

Linux进程间通信,一篇到位!

1)进程间通信介绍

什么是进程间通信?为什么需要进程间通信?

不同进程的进程标识符不同,且都拥有自己独立的虚拟地址空间,造成了进程的独立性。通过进程间通信,可以让不同进程进行协作(数据交换或者进程控制)。常见的进程间通信:网络就是一个应用最广泛的进程间通信,实现了不同用户的交互。

进程间通信的分类:
1.管道

  • 匿名管道
  • 命名管道

2.System V进程间通信

  • System V 消息队列
  • System V 共享内存
  • System V 信号量

3.POSIX IPC进程间通信

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

2)管道

什么是管道?

在shell中我们查看某个进程状态和PID的命令:ps -aux | grep test 这里的 | 就是管道符,这里的ps -aux和grep都可以理解为一个进程,把第一个进程的输出作为第二个的输入并进行操作

我们把从一个进程连接到另一个进程的一个数据流称为一个"管道"
在这里插入图片描述
管道本质: 管道也就是在内核当中开辟的一块内存,也可以称之为内核缓冲区,这段空间没有标识符。
用户态 : ps aux | grep xxx
内核态(缓冲区) : ps -aux被加载到缓冲区,然后给grep xxx

一、匿名管道

在内核中创建出来的一块内存是没有标识符的,所以管道也就没有标识符,那么怎么让其他进程也能够访问这块内存呢?

管道的创建: int pipe(int fd[2]);
fd[2]整形数组: 保存的是文件描述符,两个元素。其中fd[0]:读端,读匿名内存,fd[1]:写端,写入匿名内存,数据流向只能由写端—>流向读端
返回值: 成功返回0,失败返回-1

代码实现:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
   
    int fd[2];
    if(-1==pipe(fd))
    {
   
        perror("pipe"); //创建失败就打印错误原因并退出
        return -1;
    }
    printf("fd[0]=%d,fd[1]=%d\n",fd[0],fd[1]);

    char buf[1024]={
   0};
    strcpy(buf,"Linux");
    write(fd[1],buf,sizeof(buf));	//把buf的内容写入管道
    
    memset(buf,0,sizeof(buf));
    read(fd[0],buf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值