Bin文件如何通过共享内存方式从Linux端CPU0发送到裸机CPU1完整代码
时间: 2024-02-20 21:56:55 浏览: 60
以下是一个简单的示例代码,展示了如何通过共享内存方式在Linux端的CPU0发送二进制文件到裸机CPU1:
1. CPU0代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define SHM_NAME "/my_shared_mem"
#define FILENAME "file.bin"
#define SHM_SIZE 1024
int main(void) {
int fd;
void *shm_ptr;
FILE *fp;
size_t file_size;
// 打开二进制文件
fp = fopen(FILENAME, "rb");
if (fp == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
// 获取文件大小
fseek(fp, 0L, SEEK_END);
file_size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
// 创建共享内存
fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}
// 调整共享内存大小
if (ftruncate(fd, file_size) == -1) {
perror("ftruncate");
exit(EXIT_FAILURE);
}
// 映射共享内存到进程地址空间
shm_ptr = mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (shm_ptr == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
// 读取二进制文件到共享内存
if (fread(shm_ptr, file_size, 1, fp) != 1) {
perror("fread");
exit(EXIT_FAILURE);
}
// 解除映射
if (munmap(shm_ptr, file_size) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
// 关闭文件和共享内存
fclose(fp);
close(fd);
shm_unlink(SHM_NAME);
return 0;
}
```
2. CPU1代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define SHM_NAME "/my_shared_mem"
#define FILENAME "file.bin"
#define SHM_SIZE 1024
int main(void) {
int fd;
void *shm_ptr;
FILE *fp;
size_t file_size;
// 打开二进制文件
fp = fopen(FILENAME, "wb");
if (fp == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
// 创建共享内存
fd = shm_open(SHM_NAME, O_RDONLY, 0666);
if (fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}
// 获取共享内存大小
struct stat stat_buf;
if (fstat(fd, &stat_buf) == -1) {
perror("fstat");
exit(EXIT_FAILURE);
}
file_size = stat_buf.st_size;
// 映射共享内存到进程地址空间
shm_ptr = mmap(NULL, file_size, PROT_READ, MAP_SHARED, fd, 0);
if (shm_ptr == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
// 写入共享内存中的数据到二进制文件
if (fwrite(shm_ptr, file_size, 1, fp) != 1) {
perror("fwrite");
exit(EXIT_FAILURE);
}
// 解除映射
if (munmap(shm_ptr, file_size) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
// 关闭文件和共享内存
fclose(fp);
close(fd);
return 0;
}
```
以上代码中,CPU0程序首先打开指定的二进制文件,然后创建共享内存并调整大小以适应文件大小。接下来,将共享内存映射到进程的地址空间,并通过fread将二进制文件的内容读取到共享内存中。最后,解除映射并关闭文件和共享内存。
CPU1程序首先创建一个二进制文件,然后打开共享内存并获取其大小。接下来,将共享内存映射到进程地址空间,并通过fwrite将共享内存中的数据写入到二进制文件中。最后,解除映射并关闭文件和共享内存。
注意,以上代码中的二进制文件名和共享内存名称需要在两个程序中保持一致。此外,需要确保CPU1程序在CPU0程序之后启动,以便正确获取共享内存。
阅读全文