提问人:chiara_tummi 提问时间:8/24/2023 最后编辑:chiara_tummi 更新时间:8/24/2023 访问量:47
子进程不会修改父进程中的统计信息
Child process doesn't modify statistics in parent process
问:
我正在开发一个涉及多个进程的 C 应用程序,包括子进程和父进程,我正在尝试使用共享内存和信号量在它们之间共享统计信息。但是,我的代码遇到了一个问题,即子进程似乎没有正确修改父进程中的共享统计信息,这使我无法准确打印它们。
总的来说,我创建并附加了共享内存:
stats_shm_id = create_shared_memory(SHM_STATS_KEY, sizeof(Statistics));
stats = (Statistics *)attach_shared_memory(stats_shm_id);
init 函数执行以下操作:
stats = (Statistics *)malloc(sizeof(Statistics));
stats->shared_data_1 = 0;
stats->shared_data_2 = 0;
print 函数执行以下操作:
printf("%d",stats->shared_data1);
printf("%d",stats->shared_data2);
我的目标是让子进程修改父进程中的共享统计信息,以便可以准确地打印它们。但是,当我调用 print_statistics() 函数时,子进程所做的更改似乎不会反映在父进程中。我已经验证了是否正确使用了信号量来同步对统计信息的访问。
有人可以帮我了解可能出了什么问题吗?这可能是同步问题吗?我应该考虑哪些步骤来排查和解决此问题?
提前感谢您的任何帮助和建议!
答:
2赞
John Bollinger
8/24/2023
#1
有人可以帮我了解可能出了什么问题吗?
函数将全局变量设置为指向(未共享的)动态分配的内存。这阻碍了之前设置和附加到共享内存段的工作。事实上,这些进程根本没有使用共享内存。initialize_statistics()
stats
评论
1赞
chiara_tummi
8/24/2023
在我的程序的 main 函数中,我使用 shmget 函数创建共享内存段,并使用 shmat 在父进程和子进程中附加它们。
0赞
chiara_tummi
8/24/2023
哦不,你是对的!在进行附加后,我在初始化函数中使用了 malloc。如果我在连接之前移动 malloc,一切正常。谢谢!:)
0赞
John Bollinger
8/24/2023
@chiara_tummi,我很高兴能帮上忙,但你似乎没有完全理解这一点:你根本不应该这样做。malloc()
0赞
chiara_tummi
8/24/2023
我在问题中添加了结构统计信息,您能给我一个关于我应该如何初始化这个共享内存的建议吗?
3赞
Chris Dodd
8/24/2023
您的数据结构包含指针,因此不能有效地与共享内存一起使用 - 每个进程都将在不同的地址附加共享内存。您需要使用共享内存块开头的偏移量,而不是指针。
评论
printf(stats->shared_data1);
你是说 ?printf("%d\n", stats->shared_data1);
-Wall -Wextra -Werror -pedantic-errors
-Werror
gcc
clang