学习嵌入式第二十九天

ipc进程间通信方式

PC,即进程间通信(Inter-Process Communication),是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式:

  1. 管道:用于父子进程或兄弟进程之间的通信。
  2. 消息队列:允许进程发送和接收消息。
  3. 信号:一种简单的通知机制,用于通知进程某个事件已经发生。
  4. 共享内存:允许多个进程访问同一块内存区域。
  5. 套接字:支持进程之间的网络通信。
  6. 信号量:用于控制对共享资源的访问。
  7. **文件映射:**将文件或设备映射到内存中,实现进程间的数据共享。
  8. 远程过程调用:允许一个进程调用另一个进程的函数或方法。
  9. 事件:用于进程间同步的一种机制,通常与信号量或互斥锁一起使用

共享内存

共享内存是一种高效的进程间通信(IPC)机制,它允许两个或多个进程共享一个给定的存储区。以下是共享内存在IPC中实现的基本步骤:

  1. 创建共享内存段 :首先,一个进程(通常是父进程)创建一个共享内存段。这通常涉及到调用操作系统的API,如shmget在UNIX系统中。

  2. 附加到共享内存 :创建共享内存后,其他进程需要将这个共享内存段附加到自己的地址空间中。这通常通过shmat函数实现,它会返回共享内存的地址。

  3. 读写共享内存:一旦共享内存被附加到进程的地址空间,进程就可以像操作自己的内存一样读写共享内存中的数据。

  4. 同步:由于多个进程可以同时访问共享内存,因此需要某种形式的同步机制来避免竞态条件和数据不一致。这通常通过使用信号量(semaphores)、互斥锁(mutexes)或条件变量来实现。

  5. 内存保护:操作系统通常提供对共享内存的保护机制,以确保进程只能访问它们被授权访问的部分。

  6. 分离共享内存 :当进程不再需要访问共享内存时,它会从自己的地址空间中分离共享内存段,这通常通过shmdt函数实现。

  7. 删除共享内存:最后,当所有进程都不再需要共享内存时,创建共享内存的进程或拥有足够权限的进程可以删除共享内存段,释放资源。

//step1 产生key值

ftok //

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(const char *pathname, int proj_id);

功能:

将pathname 和 proj_id 转换为 key值

参数:

@pathname //给一个路径名

@proj_id //工程id eg: 'A'

返回值

成功 key值

失败 -1

//step2 通过key获取ipc对象 (共享内存)

shmget //shared memory

//1、申请对象:shmget()

#include <sys/ipc.h>

#include <sys/shm.h>

ps aux|grep a.out

shared memory get IPC_CREAT|0666

int shmget(key_t key, size_t size, int shmflg);

功能:

使用唯一键值key向内核提出共享内存使用申请

参数:key 唯一键值

size 要申请的共享内存大小

shmflg 申请的共享内存访问权限,八进制表示

如果是第一个申请,则用IPC_CREAT

如果要检测是否存在,用IPC_EXCL

返回值:

成功 返回共享内存id,一般用shmid表示

失败 -1;

share memory attach

//step3 共享内存 绑定

shmat

映射对象:shmat()

void *shmat(int shmid, const void *shmaddr, int shmflg);

功能:将指定shmid对应的共享内存映射到本地内存。

参数:shmid 要映射的本地内存

shmaddr 本地可用的地址,如果不确定则用NULL,表示

由系统自动分配。

shmflg

0 , 表示读写

SHM_RDONLY, 只读

返回值:

成功 返回映射的地址,一般等于shmaddr

失败 (void*)-1

//step4 解除绑定(映射)

撤销映射:shmdt

int shmdt(const void *shmaddr);

功能:将本地内存与共享内存断开映射关系。

参数:shmaddr 要断开的映射地址。

返回值:成功 0

失败 -1;

//step4 销毁IPC对象

删除对象:shmctl

int shmctl(int shmid, int cmd, struct shmid_ds *buf); //ctl = control

功能:

修改共享内存属性,也可以删除指定的共享内存对象。

参数:shmid 要删除的共享内存对象

cmd

IPC_RMID 删除对象的宏

buff NULL 表示只删除对象。

返回值:成功 0

失败 -1

网络

网络是由多个设备通过通信链路相互连接形成的系统,这些设备可以是计算机、服务器、路由器、交换机等。网络的主要功能是实现数据的传输和共享,允许用户访问远程资源、进行通信和协作。

网络可以根据其覆盖范围分为几种类型:

  1. 局域网(LAN):通常覆盖较小的地理区域,如一个办公室或学校。
  2. 广域网(WAN):覆盖较大的地理区域,可以跨越城市、国家甚至全球。
  3. 城域网(MAN):介于LAN和WAN之间,通常覆盖一个城市或地区。
  4. 个人区域网(PAN):覆盖非常小的区域,通常是个人设备之间的连接,如蓝牙耳机和手机。

简单来说 网络就是实现不同主机间通信的方法。

实现网络通信

1.物理层面 有一个 信息通路

2.软件层面(逻辑层面) 也需要 一个通路

osi七层模型

实际应用到的是 tcp/ip 模型

每个层次中,都有自己的一套规范 --- 协议

IP地址(Internet Protocol Address)是互联网协议地址,它是分配给网络中每个设备的唯一标识符,用于在互联网上进行通信。IP地址使得数据能够在网络中的不同设备之间传输。

IP地址的组成如下:

  1. 版本:IP地址分为IPv4和IPv6两个版本。IPv4是目前最常用的版本,由32位二进制数组成,通常以点分十进制表示,如192.168.1.1。IPv6是较新的版本,由128位二进制数组成,以冒号分隔的十六进制表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。

  2. 网络部分:IP地址中的网络部分用于标识设备所属的网络。在IPv4中,网络部分的长度可以根据子网掩码来确定。

  3. 主机部分:IP地址中的主机部分用于标识网络中的特定设备。

  4. 子网掩码:子网掩码用于区分IP地址中的网络部分和主机部分。它是一个与IP地址相对应的32位或128位二进制数,其中网络部分为1,主机部分为0。

  5. 广播地址:广播地址用于向同一网络中的所有设备发送数据。

  6. 特殊用途地址:包括回环地址(127.0.0.1,用于设备测试自身网络栈)、私有地址(如192.168.x.x,通常用于局域网内部通信)等。

  7. 公共地址:也称为公网地址,是分配给互联网上可访问的设备的IP地址,它们是唯一的,可以在全球范围内被识别。

  8. 动态IP地址:由DHCP服务器动态分配,每次设备连接到网络时可能会获得不同的IP地址。

  9. 静态IP地址:是手动配置的,通常用于需要固定IP地址的服务器或设备。

网络编程

UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。

在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

* 适用情况:

  1. 发送小尺寸数据(如对DNS服务器进行IP地址查询时)

  2. 在接收到数据,给出应答较困难的网络中使用UDP。(如:无

线网络)

  1. 适合于广播/组播式通信中。

  2. MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通

讯通常采用UDP协议

  1. 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP

方式进行实时数据传输

UDP特点: //广播

1.不可靠

2.无连接

3.数据报

编程模型

c/s client server 客户端,服务器模型 --- 专用客户端

b/s browser server 浏览器,服务器模型 --- 通用的客户端

p2p peer to peer 点对点传输

基于UDP c/s通信模型:

//client ---客户端 --- 角色 --- 主动的角色

socket //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)

//2.socket 编程接口 --- socket 函数

//提供了一个可以访问 操作系统 网络功能的接口

sendto //发数据

//server --- 服务器端 --角色 --- 被动的角色

socket

recvfrom //接收数据

socket

int socket(int domain, int type, int protocol);

#include <sys/types.h> /* See NOTES */

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

功能:程序向内核提出创建一个基于内存的套接字描述符

参数:

//domain --域 (范围) ---socket 用于什么范围的通信

// ipv4

// ipv6

domain 地址族,PF_INET == AF_INET ==>互联网程序

PF_UNIX == AF_UNIX ==>单机程序

type 套接字类型:

SOCK_STREAM 流式套接字 ===》TCP

SOCK_DGRAM 用户数据报套接字===>UDP

//SOCK_RAW 原始套接字 ===》IP

protocol 协议 ==》0 表示自动适应应用层协议。

返回值:

成功 返回申请的套接字文件描述符

失败 -1

ssize_t sendto( int sockfd, //用于通信的socket对应的fd

const void *buf, //表示要发送的数据所在的一块空间

size_t len, //表示发送的字节数

int flags, //0 --- 默认

const struct sockaddr *dest_addr, //表示 要发送到的 地址 (网络地址 ip+端口号 )

socklen_t addrlen //表示dest_addr 这个参数的长度

);

返回值:

成功 发送出去的字节的数

失败 -1

相关推荐
东华果汁哥6 分钟前
【linux 免密登录】快速设置kafka01、kafka02、kafka03 三台机器免密登录
linux·运维·服务器
咖喱鱼蛋27 分钟前
Ubuntu安装Electron环境
linux·ubuntu·electron
ac.char31 分钟前
在 Ubuntu 系统上安装 npm 环境以及 nvm(Node Version Manager)
linux·ubuntu·npm
肖永威37 分钟前
CentOS环境上离线安装python3及相关包
linux·运维·机器学习·centos
tian2kong40 分钟前
Centos 7 修改YUM镜像源地址为阿里云镜像地址
linux·阿里云·centos
hopetomorrow40 分钟前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow41 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
mengao123442 分钟前
centos 服务器 docker 使用代理
服务器·docker·centos
布鲁格若门44 分钟前
CentOS 7 桌面版安装 cuda 12.4
linux·运维·centos·cuda
C-cat.1 小时前
Linux|进程程序替换
linux·服务器·microsoft