这似乎应该很简单,但我找不到与它有多大关系。我的结构有不同的字段用于存储有关程序操作的数据。我想记录这些数据,以便以后分析。尝试在程序操作过程中不断记录数据会占用大量资源。因此,我只想在数据发生变化时调用日志功能。如果有一种有效的方法来检查结构成员是否已更新,我会很高兴。目前我正在玩3种结构(旧的,当前的和新的)的shell游戏,以便检测数据何时发生变化。提前致谢。
答案 0 :(得分:0)
您可以在日志功能中跟踪结构及其哈希值。
让你有一个哈希函数:
int hash(void* ptr, size_t size);
让你有一个从指针到结构到结构的散列的映射,如:
/* Stores hash value for ptr*/
void ptr2hash_update_hash(void* ptr, int hash);
/* Remove ptr from mapping */
void ptr2hash_remove(void* ptr);
/* Returns 0 if ptr was not stored, or stored has otherwise*/
int ptr2hash_get_hash(void* ptr);
然后你可以检查你的对象是否在这样的日志调用之间被更改了:
int new_hash = hash(ptr, sizeof(TheStruct));
int old_hash = ptr2hash_get_hash(ptr);
if (old_hash == new_hash)
return;
ptr2hash_update_hash(ptr, new_hash);
/* Then do the logging */
执行ptr
时,不要忘记从映射中移除free(ptr)
:)
这是simple hash table implementation,你需要它来实现ptr2hash映射。 简单的哈希函数是here。
答案 1 :(得分:0)
如果您在Linux(x86或x86_64)上运行,那么另一种可能的方法如下:
使用modify_ldt
system call在本地描述符表中为不可写段安装段描述符。将您的数据放在此段中(或安装段以使您的数据结构在其中)。
写入权限后,您的流程将收到def same(self, another):
is_same = False
if self == None and another == None:
is_same = True
if self is not None and another is not None:
is_same = ((self._root == rs._root) and identical(self._left, rs._left) and identical(self._right, rs._right))
return is_another
(细分错误)。使用SIGSEGV
安装处理程序以捕获分段错误。在该处理程序中,首先检查故障是否发生在先前设置的段(si_addr
member of the siginfo_t
)内,如果是,则准备记录通知。现在,更改段描述符,使段变为可写并从信号处理程序返回。
现在将执行写入,但您需要一种方法将段更改为不可写,并实际检查写入的内容以及数据是否实际更改。
一种可能的方法是将自己(或“延迟”过程然后再回到主过程)发送另一个信号(例如sigaction
),并在此信号的处理程序中执行上述操作。 / p>
因此,如果可以,我真的希望你这样做,请使用已建议的界面。
答案 2 :(得分:0)
您可以尝试的最简单的方法是,您可以保留两个structure pointers
。一旦您收到新的更新值,您可以将new structure pointer
与old structure pointer
进行比较,如果有任何差异,您可以检测到它,然后您可以更新为old structure pointer
所以您可以在将来检测更新值的进一步变化。
typedef struct testStruct
{
int x;
float y;
}TESTSTRUCT;
TESTSTRUCT* getUpdatedValue()
{
TESTSTRUCT *ptr;
ptr->x = 5;
ptr->y = 6;
//You can put your code to update the value.
return ptr;
}
void updateTheChange(TESTSTRUCT* oldObj,TESTSTRUCT* newObj)
{
cout << "Change Detected\n";
oldObj = newObj;
}
int main()
{
TESTSTRUCT *oldObj = NULL;
TESTSTRUCT *newObj = NULL;
newObj = getUpdatedValue();
//each time a value is updated compae with the old structure
if(newObj == oldObj)
{
cout << "Same" << endl;
}
else
{
updateTheChange(oldObj,newObj);
}
return 0;
}
我不确定,它会给你你的确切答案。
希望这有助于。