QT:QSharedMemory 正在使用相同的键创建多个段
QT: QSharedMemory is creating multiple segments with the same key
我正在编写一个应用程序,用于学习目的,它由两个可执行文件组成。除其他事项外,每个可执行文件都创建了自己的共享内存段(使用不同的密钥),之后可执行文件 A 尝试使用 B 的密钥创建一个段,并且 B 使用 A 的密钥执行相同的操作(这样做的目的是针对每个可执行文件检查另一个是否仍然 运行。我知道这可能不是完成此操作的最佳方法,但我请你不要关注这个事实)。如果任何一个程序成功地使用另一个程序的密钥创建了一个段,它就会假定另一个程序不是 运行 并采取相应的行动。
发生的问题是当 B 检查 A 时这工作正常。但是当 A 检查 B 时,它可以使用 B 已经创建的相同密钥创建段。我很确定我检查了所有可能的竞争条件,而且我也很确定两个段同时存在并具有相同的键(QSharedMemory 都使用此键创建调用 return true)。事实上,只是为了好玩,我已经将创建调用放在一个循环中,只要循环进行,它就可以使用相同的键继续创建段。我尝试直接在构造函数中传递密钥,使用 setKey() 并使用 setNativeKey() 和 none 有效。
如前所述,真正让我感到困惑的是,同样的方法适用于 B 检查 A,但反之则不然。
我不知道为什么会这样?密钥是否必须遵循任何标准? QSharedMemory 在 thread/signal/method 中使用时是否有限制或特定行为?
A 的代码片段(使用信号调用方法 - 不起作用):
//Process A "signature" creation
QSharedMemory process_a_signature("61BB200D-3579-453e-9044-");
if(process_a_signature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process A signature created.";
} else exit(0);
...
//Method that checks for process B (monitor)
void LaRunTime::checkMonitorProcess(){
QSharedMemory monitorsignature("61BB201D-3569-453e-9144-");
if(monitorsignature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process B is not running.";
} else {
qDebug() << "Process B is running.";
}
B 的代码片段(方法也称为使用信号 - WORKS)
//Process B "signature" creation
QSharedMemory monitorsignature("61BB201D-3569-453e-9144-");
if(monitorsignature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process B signature created.";
} else {
exit(0);
}
...
//Method that checks for process A
void LaClientMonitor::checkProcess(){
QSharedMemory process_a_signature("61BB200D-3579-453e-9044-");
if(process_a_signature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process A is not running.";
} else {
qDebug() << "Process A is running.";
}
所以,在其他一些情况下摆弄代码后,我发现问题正在发生,因为我在 class / 对象中创建共享内存段,出于某种原因(我相信与对象的生命周期有关)它在创建后立即被销毁。
将创建内存段的代码移动到 main.cpp 文件解决了问题。
我正在编写一个应用程序,用于学习目的,它由两个可执行文件组成。除其他事项外,每个可执行文件都创建了自己的共享内存段(使用不同的密钥),之后可执行文件 A 尝试使用 B 的密钥创建一个段,并且 B 使用 A 的密钥执行相同的操作(这样做的目的是针对每个可执行文件检查另一个是否仍然 运行。我知道这可能不是完成此操作的最佳方法,但我请你不要关注这个事实)。如果任何一个程序成功地使用另一个程序的密钥创建了一个段,它就会假定另一个程序不是 运行 并采取相应的行动。
发生的问题是当 B 检查 A 时这工作正常。但是当 A 检查 B 时,它可以使用 B 已经创建的相同密钥创建段。我很确定我检查了所有可能的竞争条件,而且我也很确定两个段同时存在并具有相同的键(QSharedMemory 都使用此键创建调用 return true)。事实上,只是为了好玩,我已经将创建调用放在一个循环中,只要循环进行,它就可以使用相同的键继续创建段。我尝试直接在构造函数中传递密钥,使用 setKey() 并使用 setNativeKey() 和 none 有效。
如前所述,真正让我感到困惑的是,同样的方法适用于 B 检查 A,但反之则不然。
我不知道为什么会这样?密钥是否必须遵循任何标准? QSharedMemory 在 thread/signal/method 中使用时是否有限制或特定行为?
A 的代码片段(使用信号调用方法 - 不起作用):
//Process A "signature" creation
QSharedMemory process_a_signature("61BB200D-3579-453e-9044-");
if(process_a_signature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process A signature created.";
} else exit(0);
...
//Method that checks for process B (monitor)
void LaRunTime::checkMonitorProcess(){
QSharedMemory monitorsignature("61BB201D-3569-453e-9144-");
if(monitorsignature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process B is not running.";
} else {
qDebug() << "Process B is running.";
}
B 的代码片段(方法也称为使用信号 - WORKS)
//Process B "signature" creation
QSharedMemory monitorsignature("61BB201D-3569-453e-9144-");
if(monitorsignature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process B signature created.";
} else {
exit(0);
}
...
//Method that checks for process A
void LaClientMonitor::checkProcess(){
QSharedMemory process_a_signature("61BB200D-3579-453e-9044-");
if(process_a_signature.create(512,QSharedMemory::ReadWrite)==true) {
qDebug() << "Process A is not running.";
} else {
qDebug() << "Process A is running.";
}
所以,在其他一些情况下摆弄代码后,我发现问题正在发生,因为我在 class / 对象中创建共享内存段,出于某种原因(我相信与对象的生命周期有关)它在创建后立即被销毁。 将创建内存段的代码移动到 main.cpp 文件解决了问题。