ipc(一)

本文介绍Linux下进程间通信中的管道通信机制,包括无名管道和有名管道的区别与使用方法,并提供了一个简单的父子进程通信示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Linux下进程间通信方式总结(管道篇)




IPC全称interprocess communication,即进程间通信。在shell下可以输入命令ipcs来查看。
[toor@zcm ipc]$ ipcs -a


------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status


------ Semaphore Arrays --------
key        semid      owner      perms      nsems


------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages


总结起来linux下进程间通信有以下几种方式:


1、管道(pipe)
2、共享队列(queue)
3、信号量(semaphore)
4、共享内存(shared memory)
5、套接字(socket)


管道
管道是UNIX系统IPC的最古老形式。它提供了进程之间的一种单向通信的方法
管道分为有名管道和有名(匿名)管道。
无名管道在父子进程中应用,有名管道是一个文件可以被系统中的所有进程使用来达到进程通信的目的。

无名管道占用两个文件描述符,只能在父子进程间使用。所以使用匿名管道就会调用fork函数创建父子进程,
可以说无名管道存在于内存中。
调用函数pipe创建。

------------------------------------------------------------------------------------------------
#include <unistd.h>

int pipe(int fildes[2]);
------------------------------------------------------------------------------------------------
pipe函数可以得到两个文件描述符:
其中fildes[0]直接可以read,即为读而打开。
  fildes[1]直接可以write,即为写而打开。
  
例如:子进程通过管道发送数据hello父进程接受并打印输出。
------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <unistd.h>

int main(void)
{
   int fd[2];
   char buff[10];
   int r;
   pipe(fd);
   if(fork() == 0)
   {
       close(fd[0]);//关闭读端
       write(fd[1], "hello\n", 6);
       return 0;
   }
   else
   {
       close(fd[1]);//关闭写端
       r = read(fd[0], buff, 6);
       buff[r] = '\0';
       printf("%s", buff);
   }
   return 0;
}
------------------------------------------------------------------------------------------------

<think>好的,用户想了解进程间通信(IPC)的实现方法及示例。我需要先回顾下常见的IPC方式,然后结合引用内容来组织回答。首先,根据用户提供的引用,有提到管道、共享内存、信号、网络套接字等。我需要确保每个方法的说明准确,并附上示例代码或应用场景。 首先,管道分为匿名管道和命名管道。匿名管道用于父子进程间通信,引用4提到pipe和fork的使用。命名管道则是FIFO,允许无亲缘关系的进程通信。这部分需要解释清楚,并给出示例代码结构。 接下来是共享内存,引用5提到QSharedMemory类,但用户可能需要更通用的实现,比如POSIX或System V的共享内存。这里需要说明共享内存的原理,以及如何在代码中创建和附加共享内存段。 然后是信号,引用2提到信号作为IPC种方式,适用于事件处理。需要说明如何注册信号处理函数,以及进程间如何发送信号,比如使用kill命令或系统调用。 网络套接字在引用3中提及,分为TCP和UDP。这部分需要简要说明套接字的使用步骤,并可能给出简单的服务器-客户端代码示例。 此外,消息队列和信号量也是常见的IPC方式,但用户提供的引用中没有直接提到,可能需要简要补充,但主要依据引用内容来回答。 需要注意引用中的内容是否正确对应每个IPC方法。例如,引用1提到Android中的IPC方式,但用户的问题可能更广泛,所以需要以通用方法为主,适当提到Android的情况。 在组织回答时,需要分点列出每种方法,说明原理、适用场景,并附上示例代码或代码结构。同时,确保使用正确的LaTeX格式,如独立公式用$$...$$,行内公式用$...$。 最后,生成相关问题时要基于提到的IPC方法,比如性能比较、适用场景、优缺点等。需要确保问题与内容相关,并能引导用户进步学习。 现在需要检查是否有遗漏的IPC方法,比如消息队列或信号量,但由于引用中没有详细提及,可能只简要提到。或者根据用户提供的引用,可能不需要深入这些内容。需要保持回答基于提供的引用,但必要时补充常识内容。 确认每个部分的引用标注正确,例如管道的部分引用4,共享内存引用5,信号引用2,网络套接字引用3,Android相关引用1。综合这些信息,组织成结构清晰的回答,并附上相关问题。</think>### 进程间通信(IPC)实现方法及示例 进程间通信(IPC)是操作系统协调多进程协同工作的核心机制。以下是常见的IPC实现方式及示例: --- #### 1. **管道(Pipe)** - **匿名管道** 适用于父子进程间通信。通过`pipe`系统调用创建,结合`fork`实现单向数据流。 **示例代码**: ```c int fd[2]; pipe(fd); // 创建管道 if (fork() == 0) { // 子进程 read(fd[0], buffer, size); // 从管道读取 } else { // 父进程 write(fd[1], data, size); // 向管道写入 } ``` 引用自[^4]。 - **命名管道(FIFO)** 允许无亲缘关系进程通过文件系统路径访问。 **示例**: ```bash mkfifo /tmp/myfifo # 创建命名管道 echo "data" > /tmp/myfifo & # 进程A写入 cat < /tmp/myfifo # 进程B读取 ``` --- #### 2. **共享内存(Shared Memory)** 通过共享物理内存区域实现高效数据交换,适用于需要高频通信的场景。 **实现步骤**: 1. 创建共享内存段 2. 进程将内存段映射到自身地址空间 3. 读写共享数据 **示例(Qt框架)**: ```cpp QSharedMemory shared("key"); shared.create(1024); // 创建1KB共享内存 shared.attach(); // 附加到共享内存 memcpy(shared.data(), data, size); // 写入数据 ``` 引用自[^5]。 --- #### 3. **信号(Signal)** 用于异步通知特定事件(如进程终止)。 **示例**: ```c // 注册信号处理函数 signal(SIGINT, handler); // 发送信号给进程 kill(pid, SIGUSR1); ``` 需注意信号处理函数的可重入性[^2]。 --- #### 4. **网络套接字(Socket)** 支持跨机器进程通信,分为TCP(可靠流式)和UDP(无连接数据报)。 **TCP示例(Python)**: ```python # 服务端 import socket s = socket.socket() s.bind(('localhost', 8080)) s.listen() conn, addr = s.accept() conn.send(b"Hello from server") # 客户端 s = socket.socket() s.connect(('localhost', 8080)) print(s.recv(1024)) ``` 引用自[^3]。 --- #### 5. **Android中的Binder** 专为Android设计的高效IPC机制,基于内核驱动和代理模式。 **示例**:定义AIDL接口文件并生成跨进程通信代码[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值