共享内存和 memcpy 问题
Shared memory and memcpy issue
我正在学习使用 C 中的共享内存进行编程 (linux)。我需要在将使用 fork() 创建的几个进程之间共享一些结构。不幸的是,当我尝试初始化新的共享地址时 space 我在 memcpy 调用中收到一个无声错误(控制台中没有输出)。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#define ROWS 10000
#define COLS 15000
struct mm_shared {
int test;
unsigned char matrix[ROWS][COLS];
};
int main(void) {
int fd;
if ((fd = shm_open("/mm", O_CREAT | O_RDWR, 0777)) == -1) {
printf(stderr, "shm_open failed! %d - %s\n", errno, strerror(errno));
}
if (ftruncate(fd, sizeof(struct mm_shared) == -1)) {
printf(stderr, "ftruncate failed! %d - %s\n", errno, strerror(errno));
}
struct mm_shared * shared;
if ((shared = mmap(NULL, sizeof(struct mm_shared), PROT_READ
| PROT_WRITE, MAP_SHARED, fd, 0)) == -1) {
printf("mmap failed! %d, %s\n", errno, strerror(errno));
}
struct mm_shared * init = (struct mm_shared *) malloc(sizeof(struct mm_shared));
memcpy(shared, init, sizeof(struct mm_shared)); <-- here lies the problem!
shm_unlink("/mm");
return EXIT_SUCCESS;
}
调试共享指针时,调试信息(eclipse调试器)显示:
Failed to execute MI command:
-data-evaluate-expression (shared)->test
Error message from debugger back end:
Cannot access memory at address 0x7ffff7ffc000
我不知道这是否有帮助。另外,我想问一下我在结构中存储大矩阵的方法是否正确(它应该分配在堆中,对吗?因为即使矩阵本身不是指针,我也会得到一个指向结构的指针)。
如有任何帮助,我们将不胜感激!
经过一个小时的调试和审查循环,终于找到了错误,就是这个
second argument for ftruncate seems to be evaluating to wrong value
if (ftruncate(fd, sizeof(struct mm_shared) == -1)) {
改为
if (ftruncate(fd, sizeof(struct mm_shared)) == -1) {
这里是修改过的代码
int main(void) {
int fd;
if ((fd = shm_open("/mm", O_CREAT | O_RDWR, 0777)) == -1) {
fprintf(stderr, "shm_open failed! %d - %s\n", errno, strerror(errno)); // should be fprintf
exit(1);// possibly exit here
}
//if (ftruncate(fd, sizeof(struct mm_shared) == -1)) {
if (ftruncate(fd, sizeof(struct mm_shared)) == -1) {
fprintf(stderr, "ftruncate failed! %d - %s\n", errno, strerror(errno)); // should be fprintf
goto out; // remove all before leaving
}
struct mm_shared * shared;
if ((shared = mmap(NULL, sizeof(struct mm_shared) , PROT_READ
| PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED ) { // Change -1 to MAP_FALED
fprintf(stderr, "mmap failed! %d, %s\n", errno, strerror(errno)); // should be fprintf and stderr
goto out; // remove all before leaving
}
struct mm_shared * init = (struct mm_shared *) malloc(sizeof(struct mm_shared));
//memcpy(shared, init, sizeof(struct mm_shared)); //<-- here lies the problem!
memcpy(init, shared, sizeof(struct mm_shared)); //<-- here lies the problem!
out:
shm_unlink("/mm");
return EXIT_SUCCESS;
}
我正在学习使用 C 中的共享内存进行编程 (linux)。我需要在将使用 fork() 创建的几个进程之间共享一些结构。不幸的是,当我尝试初始化新的共享地址时 space 我在 memcpy 调用中收到一个无声错误(控制台中没有输出)。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#define ROWS 10000
#define COLS 15000
struct mm_shared {
int test;
unsigned char matrix[ROWS][COLS];
};
int main(void) {
int fd;
if ((fd = shm_open("/mm", O_CREAT | O_RDWR, 0777)) == -1) {
printf(stderr, "shm_open failed! %d - %s\n", errno, strerror(errno));
}
if (ftruncate(fd, sizeof(struct mm_shared) == -1)) {
printf(stderr, "ftruncate failed! %d - %s\n", errno, strerror(errno));
}
struct mm_shared * shared;
if ((shared = mmap(NULL, sizeof(struct mm_shared), PROT_READ
| PROT_WRITE, MAP_SHARED, fd, 0)) == -1) {
printf("mmap failed! %d, %s\n", errno, strerror(errno));
}
struct mm_shared * init = (struct mm_shared *) malloc(sizeof(struct mm_shared));
memcpy(shared, init, sizeof(struct mm_shared)); <-- here lies the problem!
shm_unlink("/mm");
return EXIT_SUCCESS;
}
调试共享指针时,调试信息(eclipse调试器)显示:
Failed to execute MI command:
-data-evaluate-expression (shared)->test
Error message from debugger back end:
Cannot access memory at address 0x7ffff7ffc000
我不知道这是否有帮助。另外,我想问一下我在结构中存储大矩阵的方法是否正确(它应该分配在堆中,对吗?因为即使矩阵本身不是指针,我也会得到一个指向结构的指针)。
如有任何帮助,我们将不胜感激!
经过一个小时的调试和审查循环,终于找到了错误,就是这个
second argument for ftruncate seems to be evaluating to wrong value
if (ftruncate(fd, sizeof(struct mm_shared) == -1)) {
改为
if (ftruncate(fd, sizeof(struct mm_shared)) == -1) {
这里是修改过的代码
int main(void) {
int fd;
if ((fd = shm_open("/mm", O_CREAT | O_RDWR, 0777)) == -1) {
fprintf(stderr, "shm_open failed! %d - %s\n", errno, strerror(errno)); // should be fprintf
exit(1);// possibly exit here
}
//if (ftruncate(fd, sizeof(struct mm_shared) == -1)) {
if (ftruncate(fd, sizeof(struct mm_shared)) == -1) {
fprintf(stderr, "ftruncate failed! %d - %s\n", errno, strerror(errno)); // should be fprintf
goto out; // remove all before leaving
}
struct mm_shared * shared;
if ((shared = mmap(NULL, sizeof(struct mm_shared) , PROT_READ
| PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED ) { // Change -1 to MAP_FALED
fprintf(stderr, "mmap failed! %d, %s\n", errno, strerror(errno)); // should be fprintf and stderr
goto out; // remove all before leaving
}
struct mm_shared * init = (struct mm_shared *) malloc(sizeof(struct mm_shared));
//memcpy(shared, init, sizeof(struct mm_shared)); //<-- here lies the problem!
memcpy(init, shared, sizeof(struct mm_shared)); //<-- here lies the problem!
out:
shm_unlink("/mm");
return EXIT_SUCCESS;
}