首页 > 系统相关 >重头开始嵌入式第二十六天(Linux系统编程 进程间通信 IPC)

重头开始嵌入式第二十六天(Linux系统编程 进程间通信 IPC)

时间:2024-08-23 18:22:06浏览次数:12  
标签:IPC int pipefd 间通信 管道 Linux 进程 include

目录

IPC 进程间通信

1.管道通信

管道的特性

使用流程

无名管道

1.创建并打开管道:

2.无名管道的读写:

3.关闭管道: close();

4.使用例子:

有名管道

1、创建:mkfifo

2、打开有名管道 open

3、管道的读写: 文件IO

4、关闭管道:

5、卸载管道:remove();


IPC 进程间通信

进程间通信(Inter-Process Communication,简称 IPC)是指在不同进程之间进行数据交换、消息传递和资源共享的机制。
 
常见的 IPC 方式包括:
 
1. 管道(Pipe):分为无名管道和有名管道。无名管道只能在具有亲缘关系的进程间使用,而有名管道可在无亲缘关系的进程间通信。
2. 消息队列(Message Queue):消息的链表,存放在内核中并由消息队列标识符标识。
3. 共享内存(Shared Memory):多个进程可以访问同一块物理内存区域,实现快速的数据交换,但需要同步机制来协调访问。
4. 信号量(Semaphore):用于实现进程间的互斥与同步。
5. 套接字(Socket):可用于不同主机上的进程间通信,也可用于同一主机上的进程间通信。
 
进程间通信在多进程和多线程编程中起着至关重要的作用,使得不同的进程能够协同工作,完成复杂的任务。

1.管道通信

管道的特性

管道具有以下特性:
 
1. 半双工通信:数据只能在一个方向上流动。如果要实现双向通信,需要建立两个管道。
2. 只能在具有亲缘关系(如父子进程)的进程间使用:通常是父进程创建管道,然后创建子进程,子进程会继承父进程的文件描述符,从而实现通过管道通信。
3. 数据是字节流形式:管道中的数据没有固定的格式或消息边界,就像一个连续的字节流。
4. 管道的容量有限:通常是一个有限的缓冲区大小,如果写入的数据超过了缓冲区的容量,写进程会被阻塞,直到读进程读取数据腾出空间。64k
5. 管道是基于文件描述符的:通过对文件描述符进行读写操作来实现数据的传递。
6. 生命周期随进程:如果参与通信的进程结束,管道也会被销毁。
7.管道破裂,读端关闭,写管道。

使用流程

无名管道

创建管道-读写管道-关闭管道

1.创建并打开管道:

 pipe函数

#include <unistd.h>
int pipe(int pipefd[2]);

功能:创建并打开一个无名管道
参数:pipefd[0] ==>无名管道的固定读端
  pipefd[1] ==>无名管道的固定写端
返回值:成功 0
失败 -1;

注意事项:
1、无名管道的架设应该在fork之前进行。


2.无名管道的读写:

===》文件IO的读写方式。
读: read()
写: write()


3.关闭管道: close();

4.使用例子:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>              /* Obtain O_* constant definitions */
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int pipefd[2]={0};
    int ret = pipe(pipefd);
    if(-1 == ret)
    {
        perror("pipe");
        return 1;
    }

    pid_t pid = fork();
    if(pid>0)
    {
        close(pipefd[0]);
        sleep(3);
        char buf[50]="hello,child";
        write(pipefd[1],buf,strlen(buf));
    }
    else if(0 == pid)
    {
        close(pipefd[1]);
        char buf[50]={0};
        read(pipefd[0],buf,sizeof(buf));
        printf("father :%s\n",buf);
    }
    else 
    {
        perror("fork");
        return 1;
    }
    return 0;
}


有名管道

有名管道===》fifo ==》有文件名称的管道。
  文件系统中可见

框架:
创建有名管道 ==》打开有名管道 ==》读写管道
==》关闭管道  ==》卸载有名管道

 


1、创建:mkfifo

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

功能:在指定的pathname路径+名称下创建一个权限为
      mode的有名管道文件。
参数:pathname要创建的有名管道路径+名称
  mode  8进制文件权限。
返回值:成功 0
失败  -1;



2、打开有名管道 open


注意:该函数使用的时候要注意打开方式,
因为管道是半双工模式,所有打开方式直接决定
当前进程的读写方式。
一般只有如下方式:
int fd-read = open("./fifo",O_RDONLY); ==>fd 是固定读端
int fd-write = open("./fifo",O_WRONLY); ==>fd 是固定写端
不能是 O_RDWR 方式打开文件。
不能有 O_CREAT 选项,因为创建管道有指定的mkfifo函数
 


3、管道的读写: 文件IO


读: read(fd-read,buff,sizeof(buff));
写: write(fd-write,buff,sizeof(buff));


4、关闭管道:

close(fd);


5、卸载管道:remove();

int unlink(const char *pathname);

功能:将指定的pathname管道文件卸载,同时
  从文件系统中删除。
参数: ptahtname 要卸载的有名管道 
返回值:成功 0
失败  -1;

标签:IPC,int,pipefd,间通信,管道,Linux,进程,include
From: https://blog.csdn.net/qq_64792908/article/details/141461043

相关文章

  • Linux四剑客-find和grep
    Linux四剑客之grep&find1、grep过滤:在文件中或管道中进行查找,找出想要的内容(字符串)默认按照行查找,grep会把匹配到的行显示出来。1.1常用选项说明grep选项说明-niline-number显示行号-ignore-case过滤的时候忽略大小写-v排除,取反-E匹配扩展正则,相当于egrep1.2案例......
  • Linux hosts主机名不对
    Linux的root用户和oracle用户显示的主机名不一致安装完oracle之后,root用户的主机名为localhost,但是oracle用户的主机名显示bogon。转载:Linuxhosts主机名不对1、现象:[root@bogon~]#[root@bogon~]#hostnamebogon2、查看几个相关文件,都正确[root@bogon~]#vi/etc/sysc......
  • VMware部署Linux使用代理
    代理软件配置以clashverge为例在Linux虚拟机配置临时代理,关闭终端失效exporthttp_proxy=http://10.0.0.1:7897exporthttps_proxy=http://10.0.0.1:7897exportftp_proxy=http://10.0.0.1:7897exportno_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"......
  • Linux PXE高效批量网络装机
    目录一、PXE概念1.PXE基本概念  2.优点 3.实现PXE的前提条件 4.搭建PXE远程安装服务器二、搭建PXE远程安装服务器1.安装并启用TFTP服务 2.安装并启用DHCP服务3.准备Linux内核、初始化镜像文件4.准备PXE引导程序5.安装FTP服务,准备CentOS7安装源6.......
  • linux 安装 jenkins
    1、下载jenkinswar安装包官方地址:https://www.jenkins.io/download/注:需要注意jenkins版本和jkd版本匹配问题2、将war包上传服务器,启动war包即可启动命令:nohupjava-Djava.awt.headless=true-Djava.io.tmpdir=/data/jenkins/jenkins_home/tmp-jarjenkins-*.*.war--http......
  • Kali Linux 秘籍 中文版
    《KaliLinux秘籍中文版》是一本由WillieL.Pritchett和DavidDeSmet合著的专业书籍,由飞龙翻译,采用CCBY-NC-SA4.0版权协议。这本书详细介绍了KaliLinux的安装、配置和使用技巧,特别是针对渗透测试和网络安全方面的工具和方法。###安装KaliLinux根据《KaliLinux秘籍......
  • Linux系统性能调优指南-监控与报警
    目录监控与报警实时监控示例示例代码Nagios配置示例监控与报警在Linux系统中,持续监控系统资源使用情况并及时发现潜在问题是保证系统稳定运行的关键。下面将详细介绍如何使用Nagios和Zabbix等工具来实现监控与报警功能。实时监控Nagios和Zabbix是两种非常流行的......
  • 从百度网盘中下载文件到linux服务器
    前提:先安装python环境1.安装包pipinstallbypy2.认证(第一次连接需要认证)bypyinfo 3.浏览器中打开,复制授权码,enter输入 4.认证成功后,在网盘中的“我的应用数据”目录下看到bypy目录,将要传输的数据放入bypy文件夹中。5.下载文件或者下载文件夹bypydownfile123ata.zi......
  • 阿里巴巴中间件canal的搭建和使用以及linux命令下使用mail发送html格式的邮件
    一、阿里巴巴中间件canal的搭建和使用    canal可以用来监控数据库数据的变化(binlog日志),从而获得指定数据的变化。canal是应阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求时开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅......
  • linux 的启动步骤
    Linux的启动过程分为多个阶段,每个阶段都扮演着重要的角色,从引导加载程序到启动用户空间的服务和应用程序。以下是Linux启动的典型步骤:1.BIOS/UEFI阶段BIOS/UEFI启动:当计算机开机时,BIOS(传统系统)或UEFI(较新的系统)会运行硬件自检(POST),然后查找启动设备(例如硬盘、USB或光......