【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述
在Linux中,进程间通信(IPC)主要有以下几种方式:
- 匿名管道(Pipe):提供一条管道,用于进程间的单向数据传输。
- 命名管道(Named Pipe):类似于匿名管道,但可以在系统中命名,允许无关进程间通信。
- System V 共享内存区方案:允许多个进程共享一块内存区域,是最快的IPC方式。
以下是使用这些方式的示例代码:
匿名管道:
#include <unistd.h>
int main() {
int fd[2];
if (pipe(fd) == -1) {
return -1;
}
if (fork() == 0) {
// 子进程写入
close(fd[0]);
write(fd[1], "Hello, Pipe!", 13);
close(fd[1]);
} else {
// 父进程读取
close(fd[1]);
char buffer[20];
read(fd[0], buffer, 20);
printf("Received: %s\n", buffer);
close(fd[0]);
}
return 0;
}
命名管道:
# 创建命名管道
mkfifo mypipe
# 一个进程写入
echo "Hello, Named Pipe!" > mypipe
# 另一个进程读取
cat < mypipe
System V 共享内存区方案:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
int main() {
int shm_id;
char* shm_addr;
// 创建共享内存
shm_id = shmget(IPC_PRIVATE, 1024, 0666);
// 连接共享内存
shm_addr = shmat(shm_id, NULL, 0);
if (fork() == 0) {
// 子进程写入
sprintf(shm_addr, "Hello, Shared Memory!");
} else {
// 父进程等待子进程写入后读取
wait(NULL);
printf("Received: %s\n", (char*)shm_addr);
}
// 断开共享内存
shmdt(shm_addr);
// 删除共享内存
shmctl(shm_id, IPC_RMID, NULL);
return 0;
}
这些代码提供了进程间通信的基本概念和示例。在实际应用中,你需要根据具体需求来选择合适的IPC方式,并处理好并发和同步等问题。
评论已关闭