mmap() return 未在函数之间传递
mmap() return not passed between functions
我确定我遗漏了一些简单的东西,但几天来我一直在用头撞墙,但在多次阅读 mmap 和谷歌搜索后仍然没有接近。
我这里有一个(精简)程序,其中共享内存 space 用于尝试启用 debugs/tracing 而程序是 运行 但我处于第一阶段尝试 return 将 mmap 指针返回到主例程而不用担心调用者。
主例程在另一个例程 (sharedmemoryv.c) 中调用 POSIX 共享内存函数,并且对于 shm_open、ftruncate 和 mmap 似乎已经成功 returns ,但是当控制返回到主例程时,mmap 的 return 为 NULL (*debug_flag),导致 SEGV 错误。
任何推动或指导将不胜感激。
运行应用程序的输出如下:
./Whosebug.o
PError is: : Success
IN SHARED MEMORY FNT1 0
IN SHARED MEMORY FNT2 1
debug flag is null
Segmentation fault
GDB 显示它确实与 debug_flag 以前没有分配任何东西有关。
debug flag is null
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a4c in print_debug (debug_flag=0x0, title_string=0x400cad "debug prog", first_string=0x400c9e "finishing main", second_string=0x400c9d "") at debug.c:8
8 if(DEBUG_ON == *debug_flag)
main.c:
1
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #include "debug.h"
6 #include "sharedmemoryv.h"
7 #include "sharedmemory.h"
8
9
10 int *debug_flag = NULL;
11
12 int main(void)
13 {
14 enum data_type { TYPE_INT_SIGNED, TYPE_LONG_LONG_SIGNED, TYPE_CHAR_SIGNED };
15
16 enum data_type type_for_debug = TYPE_INT_SIGNED;
17
18 shared_memory_variable(type_for_debug, debug_flag, DEBUG_FLAG_1);
19
20 if(debug_flag == NULL)
21 {
22 printf("%s\n", "debug flag is null");
23 }
24 print_debug(debug_flag, "debug prog", "finishing main", BLANK_STRING);
25
26 return 0;
27 }
sharedmemoryv.c:
1 #include <stdio.h>
2 #include <sys/mman.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <sys/types.h>
7 #include <string.h>
8 #include <stdlib.h>
9 #include <errno.h>
10
11 #include "debug.h"
12
13 int shared_memory_variable(int type, void *variable, char *shared_memory_reference)
14 {
15 enum data_type { TYPE_INT_SIGNED, TYPE_LONG_LONG_SIGNED, TYPE_CHAR_SIGNED };
16 int shared_memory_fd = 0;
17
18 shm_unlink(shared_memory_reference);
19
20 if(-1 == (shared_memory_fd = shm_open(shared_memory_reference, O_CREAT|O_RDWR|O_EXCL, S_IRWXU|S_IRWXG|S_IRWXO)))
21 {
22 fprintf(stdout, "%s%s\n", "Could not create a shared memory segment for ", shared_memory_reference);
23 return -1;
24 }
25
26 if(0 != ftruncate(shared_memory_fd, sizeof(int)))
27 {
28 printf("%s\n", "ftruncate has an error");
29 perror("ftruncate error is ");
30 }
31 if(MAP_FAILED == (variable = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, shared_memory_fd, 0)))
32 {
33 printf("%s\n", "POINTER ALLOCATION FAILED FOR MMAP");
34 }
35 perror("PError is: ");
36 printf("%s%d\n", "IN SHARED MEMORY FNT1 ", *(int *) variable);
37 *(int *) variable = DEBUG_ON;
38 printf("%s%d\n", "IN SHARED MEMORY FNT2 ", *(int *) variable);
39
40 close(shared_memory_fd);
41 return 0;
42 }
debug.c
1 #include <stdio.h>
2
3 #define DEBUG_ON 1
4 #define DEBUG_OFF 0
5
6 int print_debug(int *debug_flag, const char *title_string, const char *first_string, const char *second_string)
7 {
8 if(DEBUG_ON == *debug_flag)
9 {
10 fprintf(stdout, "%s%s%s%s%s\n", title_string, ": ", first_string," ", second_string);
11
12 }
13 return 0;
14 }
为了完整起见,头文件如下所示:
debug.h
1 extern int *debug_flag;
2
3 int print_debug(int *debug_flag, const char *title_string, const char *first_string, const char *second_string);
4
5 #define BLANK_STRING ""
6 #define DEBUG_ON 1
7 #define DEBUG_OFF 0
8
sharedmemory.h
1 #define DEBUG_FLAG_1 "/debug_flag_1"
sharedmemoryv.h
1 int shared_memory_variable(int type, void *variable, char *shared_memory_reference);
您从未将 debug_flag
设置为 NULL
以外的任何值。
C 是按值传递的,因此当您将 debug_flag
传递给 shared_memory_variable
时,它的值被复制到参数 variable
中。当您稍后设置 variable
的值时,此更改不会传播到 debug_flag
。在函数内部,您正在打印 variable
的值而不是 debug_flag
.
的值
现在您正在通过 void *variable
参数将 debug_flag
中的 NULL 传递给 shared_memory_variable
。由于您已按值传递它,因此该函数无法修改它!
你需要传递一个指针到debug_flag
到shared_memory_variable
:
int shared_memory_variable(int type, void **variable, char *shared_memory_reference)
{
// ...
if(MAP_FAILED == (*variable = mmap
和
int *debug_flag = NULL;
int main(void)
{
// ...
shared_memory_variable(type_for_debug, &debug_flag, DEBUG_FLAG_1);
我确定我遗漏了一些简单的东西,但几天来我一直在用头撞墙,但在多次阅读 mmap 和谷歌搜索后仍然没有接近。
我这里有一个(精简)程序,其中共享内存 space 用于尝试启用 debugs/tracing 而程序是 运行 但我处于第一阶段尝试 return 将 mmap 指针返回到主例程而不用担心调用者。
主例程在另一个例程 (sharedmemoryv.c) 中调用 POSIX 共享内存函数,并且对于 shm_open、ftruncate 和 mmap 似乎已经成功 returns ,但是当控制返回到主例程时,mmap 的 return 为 NULL (*debug_flag),导致 SEGV 错误。
任何推动或指导将不胜感激。
运行应用程序的输出如下:
./Whosebug.o
PError is: : Success
IN SHARED MEMORY FNT1 0
IN SHARED MEMORY FNT2 1
debug flag is null
Segmentation fault
GDB 显示它确实与 debug_flag 以前没有分配任何东西有关。
debug flag is null
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a4c in print_debug (debug_flag=0x0, title_string=0x400cad "debug prog", first_string=0x400c9e "finishing main", second_string=0x400c9d "") at debug.c:8
8 if(DEBUG_ON == *debug_flag)
main.c:
1
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #include "debug.h"
6 #include "sharedmemoryv.h"
7 #include "sharedmemory.h"
8
9
10 int *debug_flag = NULL;
11
12 int main(void)
13 {
14 enum data_type { TYPE_INT_SIGNED, TYPE_LONG_LONG_SIGNED, TYPE_CHAR_SIGNED };
15
16 enum data_type type_for_debug = TYPE_INT_SIGNED;
17
18 shared_memory_variable(type_for_debug, debug_flag, DEBUG_FLAG_1);
19
20 if(debug_flag == NULL)
21 {
22 printf("%s\n", "debug flag is null");
23 }
24 print_debug(debug_flag, "debug prog", "finishing main", BLANK_STRING);
25
26 return 0;
27 }
sharedmemoryv.c:
1 #include <stdio.h>
2 #include <sys/mman.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <sys/types.h>
7 #include <string.h>
8 #include <stdlib.h>
9 #include <errno.h>
10
11 #include "debug.h"
12
13 int shared_memory_variable(int type, void *variable, char *shared_memory_reference)
14 {
15 enum data_type { TYPE_INT_SIGNED, TYPE_LONG_LONG_SIGNED, TYPE_CHAR_SIGNED };
16 int shared_memory_fd = 0;
17
18 shm_unlink(shared_memory_reference);
19
20 if(-1 == (shared_memory_fd = shm_open(shared_memory_reference, O_CREAT|O_RDWR|O_EXCL, S_IRWXU|S_IRWXG|S_IRWXO)))
21 {
22 fprintf(stdout, "%s%s\n", "Could not create a shared memory segment for ", shared_memory_reference);
23 return -1;
24 }
25
26 if(0 != ftruncate(shared_memory_fd, sizeof(int)))
27 {
28 printf("%s\n", "ftruncate has an error");
29 perror("ftruncate error is ");
30 }
31 if(MAP_FAILED == (variable = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, shared_memory_fd, 0)))
32 {
33 printf("%s\n", "POINTER ALLOCATION FAILED FOR MMAP");
34 }
35 perror("PError is: ");
36 printf("%s%d\n", "IN SHARED MEMORY FNT1 ", *(int *) variable);
37 *(int *) variable = DEBUG_ON;
38 printf("%s%d\n", "IN SHARED MEMORY FNT2 ", *(int *) variable);
39
40 close(shared_memory_fd);
41 return 0;
42 }
debug.c
1 #include <stdio.h>
2
3 #define DEBUG_ON 1
4 #define DEBUG_OFF 0
5
6 int print_debug(int *debug_flag, const char *title_string, const char *first_string, const char *second_string)
7 {
8 if(DEBUG_ON == *debug_flag)
9 {
10 fprintf(stdout, "%s%s%s%s%s\n", title_string, ": ", first_string," ", second_string);
11
12 }
13 return 0;
14 }
为了完整起见,头文件如下所示:
debug.h
1 extern int *debug_flag;
2
3 int print_debug(int *debug_flag, const char *title_string, const char *first_string, const char *second_string);
4
5 #define BLANK_STRING ""
6 #define DEBUG_ON 1
7 #define DEBUG_OFF 0
8
sharedmemory.h
1 #define DEBUG_FLAG_1 "/debug_flag_1"
sharedmemoryv.h
1 int shared_memory_variable(int type, void *variable, char *shared_memory_reference);
您从未将 debug_flag
设置为 NULL
以外的任何值。
C 是按值传递的,因此当您将 debug_flag
传递给 shared_memory_variable
时,它的值被复制到参数 variable
中。当您稍后设置 variable
的值时,此更改不会传播到 debug_flag
。在函数内部,您正在打印 variable
的值而不是 debug_flag
.
现在您正在通过 void *variable
参数将 debug_flag
中的 NULL 传递给 shared_memory_variable
。由于您已按值传递它,因此该函数无法修改它!
你需要传递一个指针到debug_flag
到shared_memory_variable
:
int shared_memory_variable(int type, void **variable, char *shared_memory_reference)
{
// ...
if(MAP_FAILED == (*variable = mmap
和
int *debug_flag = NULL;
int main(void)
{
// ...
shared_memory_variable(type_for_debug, &debug_flag, DEBUG_FLAG_1);