Linux基础 -- 进程间通讯概览

Linux Kernel 进程间通信研究项

进程间通信(IPC)是 Linux 内核进程管理中的重要组成部分,提供了多个进程之间交换数据和同步执行的机制。以下是需要研究的进程间通信的细分项:

1. 信号(Signals)

信号是一种异步通信机制,用于通知进程发生某些事件,如异常、定时器到期或用户输入。

  • 常用信号类型
    • SIGKILL:强制终止进程,无法被捕获或忽略。
    • SIGTERM:请求终止进程,进程可以捕获该信号并进行清理。
    • SIGSTOP:停止进程的执行。
    • SIGCHLD:子进程终止或状态变化时发送给父进程。
  • 信号处理机制
    • 信号处理程序:通过 signal()sigaction() 函数注册信号处理函数。
    • 信号屏蔽:使用 sigprocmask() 函数屏蔽或解屏信号。
    • 信号队列:实时信号可通过信号队列传递额外的信息。

2. 管道和命名管道(Pipes and Named Pipes)

管道是 Unix 风格的进程间通信机制,允许一个进程写入数据,另一个进程读取数据。

  • 匿名管道
    • 通过 pipe() 系统调用创建,只能在父子进程或兄弟进程之间使用。
    • 通常用于短期通信。
  • 命名管道(FIFO)
    • 通过 mkfifo() 系统调用创建,存在于文件系统中,任何进程都可以通过路径名访问。
    • 适合无亲缘关系的进程间通信。

3. 消息队列(Message Queues)

消息队列允许进程以消息为单位进行通信,并可以为消息设置优先级。

  • System V 消息队列
    • 通过 msgget()msgsnd()msgrcv() 等系统调用进行操作。
    • 消息队列具有消息的结构化格式,支持对消息的优先级排序。
  • POSIX 消息队列
    • 提供与 System V 类似的功能,但通过文件描述符进行操作,具备实时性和可靠性。
    • 支持异步通知和消息通知机制。

4. 共享内存(Shared Memory)

共享内存是最快的 IPC 机制之一,允许多个进程直接访问同一块内存,从而实现高速的数据交换。

  • System V 共享内存
    • 通过 shmget()shmat()shmdt() 系统调用分配和操作共享内存。
    • 进程必须使用同步机制(如信号量)来避免竞态条件。
  • POSIX 共享内存
    • 通过文件描述符来映射共享内存,使用 shm_open()mmap() 进行内存映射。
    • 简化了内存分配和释放的过程。

5. 信号量(Semaphores)

信号量是一种用于进程同步的机制,确保多个进程在访问共享资源时不会发生冲突。

  • System V 信号量
    • 提供信号量集(多个信号量),通过 semget()semop()semctl() 操作信号量。
    • 通常与共享内存结合使用,防止并发访问带来的问题。
  • POSIX 信号量
    • 提供简单的计数信号量,分为有名信号量(通过 sem_open() 创建)和无名信号量(在进程间使用共享内存传递)。

6. 套接字(Sockets)

套接字不仅用于网络通信,还可以用于本地进程间通信,尤其是使用 Unix 域套接字。

  • Unix 域套接字
    • 通过 socket()bind()listen()accept()connect() 系统调用操作。
    • 支持数据流和数据报两种通信模式。
    • 适合大规模数据传输和复杂交互,尤其适用于本地进程间通信。
  • TCP/UDP 套接字
    • 常用于跨网络通信,但也可以用于同一主机内的进程间通信。
    • 提供可靠的面向连接的通信(TCP)或无连接的通信(UDP)。

Netlink 是 Linux 内核提供的一种特殊套接字,用于在用户空间与内核空间之间进行通信。

  • 使用场景
    • 通常用于网络子系统,支持路由、设备配置等。
    • 用户进程可以通过 Netlink 套接字与内核模块通信,获取系统状态或配置系统资源。
  • Netlink API
    • 使用 socket()sendmsg()recvmsg() 系统调用与内核交换消息。

8. Futex(Fast Userspace Mutexes)

Futex 是一种轻量级的用户空间锁机制,允许在用户空间处理大部分的锁操作,只有在发生冲突时才进入内核。

  • 原理
    • 使用共享内存中的整数变量作为锁,进程通过 futex() 系统调用在用户态和内核态之间切换。
    • 高效且适用于高性能多线程程序中的进程同步。
  • 常见用法
    • Futex 可以用来实现互斥锁、条件变量、读写锁等同步原语。
相关推荐
watermelonoops9 分钟前
Deepin和Windows传文件(Xftp,WinSCP)
linux·ssh·deepin·winscp·xftp
疯狂飙车的蜗牛1 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
远游客07133 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<3 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟3 小时前
centos-stream9系统安装docker
linux·docker·centos
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
cominglately6 小时前
centos单机部署seata
linux·运维·centos
魏 无羡6 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse6 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux7 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算