memfd_create创建的文件句柄在另一个进程中如何使用,代码例子
时间: 2024-02-13 20:03:07 浏览: 309
下面是一个简单的 C 语言代码示例,演示如何在两个进程中使用 `memfd_create` 创建的文件句柄进行进程间通信:
```c
// 进程 A
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
// 在进程 A 中创建一个匿名的文件描述符
int memfd = memfd_create("sharedmem", 0);
if (memfd == -1) {
perror("memfd_create");
return 1;
}
// 设置文件描述符的大小
if (ftruncate(memfd, 4096) == -1) {
perror("ftruncate");
return 1;
}
// 在进程 A 中映射该文件描述符到内存中
void *addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, memfd, 0);
if (addr == MAP_FAILED) {
perror("mmap");
return 1;
}
// 在进程 A 中写入数据到共享内存中
sprintf((char*)addr, "Hello from process A");
// 将文件描述符的值发送给进程 B
printf("Sending file descriptor %d to process B...\n", memfd);
if (write(STDOUT_FILENO, &memfd, sizeof(memfd)) == -1) {
perror("write");
return 1;
}
// 等待进程 B 读取共享内存中的数据
printf("Waiting for process B...\n");
sleep(5);
// 取消映射文件描述符
if (munmap(addr, 4096) == -1) {
perror("munmap");
return 1;
}
// 关闭文件描述符
if (close(memfd) == -1) {
perror("close");
return 1;
}
return 0;
}
```
```c
// 进程 B
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
// 从进程 A 中读取文件描述符的值
int memfd;
printf("Waiting for file descriptor from process A...\n");
if (read(STDIN_FILENO, &memfd, sizeof(memfd)) == -1) {
perror("read");
return 1;
}
// 在进程 B 中创建一个匿名的文件描述符
int memfd2 = memfd_create("sharedmem2", 0);
if (memfd2 == -1) {
perror("memfd_create");
return 1;
}
// 设置文件描述符的大小
if (ftruncate(memfd2, 4096) == -1) {
perror("ftruncate");
return 1;
}
// 在进程 B 中映射该文件描述符到内存中
void *addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, memfd2, 0);
if (addr == MAP_FAILED) {
perror("mmap");
return 1;
}
// 在进程 B 中从共享内存中读取数据,并将其打印出来
printf("Message from process A: %s\n", (char*)addr);
// 在进程 B 中写入数据到共享内存中
sprintf((char*)addr, "Hello from process B");
// 取消映射文件描述符
if (munmap(addr, 4096) == -1) {
perror("munmap");
return 1;
}
// 关闭文件描述符
if (close(memfd) == -1) {
perror("close");
return 1;
}
if (close(memfd2) == -1) {
perror("close");
return 1;
}
return 0;
}
```
这个示例中,进程 A 和进程 B 都使用 `memfd_create` 创建了一个匿名的文件描述符,并将其映射到内存中。进程 A 向进程 B 发送文件描述符的值,进程 B 接收到文件描述符后,创建一个新的匿名文件描述符,并将其映射到内存中。进程 B 从共享内存中读取进程 A 写入的数据,并将自己的数据写入到共享内存中,然后关闭文件描述符。最后,进程 A 等待进程 B 处理完共享内存中的数据,然后也关闭文件描述符。
阅读全文