子进程不会修改父进程中的统计信息

Child process doesn't modify statistics in parent process

提问人:chiara_tummi 提问时间:8/24/2023 最后编辑:chiara_tummi 更新时间:8/24/2023 访问量:47

问:

我正在开发一个涉及多个进程的 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() 函数时,子进程所做的更改似乎不会反映在父进程中。我已经验证了是否正确使用了信号量来同步对统计信息的访问。

有人可以帮我了解可能出了什么问题吗?这可能是同步问题吗?我应该考虑哪些步骤来排查和解决此问题?

提前感谢您的任何帮助和建议!

C UNIX 进程 信号量 共享内存

评论

0赞 David Ranieri 8/24/2023
printf(stats->shared_data1);你是说 ?printf("%d\n", stats->shared_data1);
2赞 Ted Lyngmo 8/24/2023
添加编译器选项并修复所有内容。即使没有,我也会感到惊讶,如果或会编译这个。-Wall -Wextra -Werror -pedantic-errors-Werrorgccclang
0赞 chiara_tummi 8/24/2023
@TedLyngmo 当然,我简化了问题。无论如何,我已经添加了标志,并且我的程序中没有任何错误。
0赞 chiara_tummi 8/24/2023
@DavidRanieri 是的,当然
1赞 Chris Dodd 8/24/2023
您的数据结构包含指针,因此不能有效地与共享内存一起使用 - 每个进程都将在不同的地址附加共享内存。您需要使用共享内存块开头的偏移量,而不是指针。

答:

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
您的数据结构包含指针,因此不能有效地与共享内存一起使用 - 每个进程都将在不同的地址附加共享内存。您需要使用共享内存块开头的偏移量,而不是指针。