IPC 进程间通信方式

一、共享内存(最高效的进程间通信方式)

1.是一块内核预留的空间,避免了用户空间到内核空间的数据拷贝。

2.IPC对象操作通用框架:

0x ftok

key值 == >申请 == 》读写 == 》关闭 == 》卸载

(1) ftok

ftok 函数用于生成一个唯一的IPC键(key),通常用于创建共享内存、消息队列或信号量等。

原型

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

参数
  • pathname: 指向一个文件路径的字符串,这个文件用于生成唯一的键。
  • proj_id: 一个项目标识符,通常是一个字符,结合 pathname 生成唯一键。
返回值
  • 成功时返回一个唯一的IPC键;失败时返回 -1,并设置 errno

**(2)shmget**函数用于创建一个共享内存段或获取一个已存在的共享内存段的标识符。

原型

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

参数
  • key: 由 ftok 生成的 IPC 键。
  • size: 请求的共享内存大小(以字节为单位)。
  • shmflg: 操作标志,例如权限、创建标志等。
返回值
  • 成功时返回共享内存段的标识符;失败时返回 -1,并设置 errno

(3) shmat

shmat 函数用于将共享内存段附加到调用进程的地址空间。

原型

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

参数
  • shmid: 通过 shmget 获取的共享内存段标识符。
  • shmaddr: 首选的附加地址(通常设为 NULL,让系统选择地址)。
  • shmflg: 附加标志,通常为 0。
返回值
  • 成功时返回共享内存段的地址;失败时返回 (void *) -1,并设置 errno

(4) shmdt

shmdt 函数用于将共享内存段从调用进程的地址空间分离。

原型

int shmdt(const void *shmaddr);

参数
  • shmaddr: 先前通过 shmat 返回的共享内存段地址。
返回值
  • 成功时返回 0;失败时返回 -1,并设置 errno

(5)shmctl

shmctl 函数用于控制共享内存段的属性。

原型

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

参数
  • shmid: 通过 shmget 获取的共享内存段标识符。
  • cmd: 控制命令,例如 IPC_STAT(获取共享内存段状态)和 IPC_RMID(删除共享内存段)。
  • buf: 指向 shmid_ds 结构的指针,用于获取或设置共享内存段的属性(根据 cmd 的值)。
返回值
  • 成功时返回 0;失败时返回 -1,并设置 errno

示例

二、网络(不同主机间的通信)

IP:用来标识一台主机;

  1. IPv4地址:由四个以点分隔的十进制数字组成,每个数字的范围是0到255,例如:192.168.1.1。由于IPv4地址的数量有限,已经无法满足全球设备的需求。

  2. IPv6地址:为了解决IPv4地址耗尽的问题,IPv6引入了更大的地址空间。IPv6地址由八组四位十六进制数构成,以冒号分隔,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。

网络号 + 主机号

端口号:用来表示主机中某一具体(进行网络通信)的进程

1.osi参考七层模型

(1)物理层

(2)数据链路层

(3)网络层

(4)传输层(传输控制层)

(5)会话层

(6)表示层

(7)应用层:直接获取要收发的数据

实际应用的为TCP/IP模型

三、tcp / udp

  1. TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通作(即数

据无误、数据无丢失、数据无失序、数据无重复到达的通信)

*适用情况:

(1) 适合于对传输质量要求较高,以及传输大量数据

的通信。

(2) 在需要可靠数据传输的场合,通常使用TCP协议

(3)MSN/QQ等即时通讯软件的用户登录账户管理相关

的功能通常采用TCP协议

tcp协议特点:

(1) 面向连接

(2)可靠传输

(3)面向字节流程

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

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

* 适用情况:

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

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

线网络)

(3)适合于广播/组播式通信中。

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

讯通常采用UDP协议

(5)流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP

方式进行实时数据传输

UDP特点:

(1)不可靠

(2)无连接

(3)数据报

3.网络编程实现

(1)编程模型

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

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

p2p peer to peer 点对点传输

(2)

(1)socket

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

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

函数参数

  1. domain:

    • 指定所使用的地址族 (Address Family),常用的值有:
      • AF_INET: IPv4 Internet协议。
      • AF_INET6: IPv6 Internet协议。
      • AF_UNIX: 本地通信(进程间通信,IPC)。
  2. type:

    • 指定 Socket 的类型,常用的值有:
      • SOCK_STREAM: 面向连接的 TCP Socket。
      • SOCK_DGRAM: 无连接的 UDP Socket。
      • SOCK_RAW: 原始 Socket,用于接收和发送任意协议的网络数据。
  3. protocol:

    • 通常为 0,表示使用默认的协议。根据 domaintype 来选择合适的协议。例如:
      • 对于 SOCK_STREAM,可以指定 IPPROTO_TCP
      • 对于 SOCK_DGRAM,可以指定 IPPROTO_UDP

返回值

  • 成功时,返回一个 Socket 描述符(int 类型),可以用来引用该 Socket。
  • 失败时,返回 -1,并设置相应的错误代码(可以通过 errno 获取)。

(2)sendto

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

参数说明

  1. sockfd:

    • 要发送数据的 Socket 描述符,通常是通过 socket 函数创建的。
  2. buf:

    • 指向要发送的数据的缓冲区的指针。
  3. len:

    • 发送数据的字节数,通常是 buf 中有效数据的大小。
  4. flags:

    • 发送时的标志,通常为 0。可以设置一些特定的标志,例如 MSG_DONTWAIT 等,但大多数情况下不会用到。
  5. dest_addr:

    • 指向目标地址的结构体指针,通常是一个 sockaddr_in 结构体,用于指定目标主机的 IP 地址和端口。
  6. addrlen:

    • dest_addr 结构体的大小。可以使用 sizeof(struct sockaddr_in) 来获取。

返回值

  • 成功时,返回实际发送的字节数。
  • 失败时,返回 -1,并设置相应的错误代码(可以通过 errno 获取)。

(1)htons:用于将一个短整数(16位,无符号整数)从主机字节顺序转换为网络字节顺序。网络字节顺序(big-endian)用于在网络上传输数据,确保不同主机之间的数据可以正确解析。

(2)inet_addr:是一个用于将 IPv4 地址的字符串表示法转换为网络字节顺序的二进制格式的函数。这个函数通常用于网络编程中,尤其是在与套接字(sockets)相关的应用中,以指定一个目的地 IP 地址。

示例:

相关推荐
€☞扫地僧☜€1 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
hjjdebug1 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯1 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩1 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花1 小时前
第六章:DNS域名解析服务器
运维·服务器
Spring_java_gg1 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
✿ ༺ ོIT技术༻1 小时前
Linux:认识文件系统
linux·运维·服务器
恒辉信达1 小时前
hhdb数据库介绍(8-4)
服务器·数据库·mysql