C 文件写入操作前的触发器函数
假设我们有一个函数:C 文件写入操作前的触发器函数,c,io,C,Io,假设我们有一个函数: void persist_result(FILE* to, unsigned char* b, int b_len) {...} 这将在给定的文件*中将一些结果保存到 现在,我想在将数据写入到之前获取数据,对其执行一些操作(假设对其进行加密等),然后直接或间接调用实际的IO操作 一种解决方案是设置缓冲区,但我不知道如何触发加密操作的方法 我还想在内存中获得一些文件句柄,但不知道是否有任何ISO方法可以做到这一点 还是有更好的解决办法 考虑以下几点: persist\u结果
void persist_result(FILE* to, unsigned char* b, int b_len) {...}
这将在给定的文件*中将一些结果保存到
现在,我想在将数据写入到
之前获取数据,对其执行一些操作(假设对其进行加密等),然后直接或间接调用实际的IO操作
一种解决方案是设置缓冲区,但我不知道如何触发加密操作的方法
我还想在内存中获得一些文件句柄,但不知道是否有任何ISO方法可以做到这一点
还是有更好的解决办法
考虑以下几点:
persist\u结果需要写入的数据大小未知,可能是1个或更多字节
persist\u result
的源你要找的是那个。 当函数被调用时,实际上您可以首先捕获该调用,做任何您喜欢的事情,然后继续您正在做的事情。您可以使用指向函数的指针在C中实现它
您可以从以下内容中获得灵感您正在寻找的是。 当函数被调用时,实际上您可以首先捕获该调用,做任何您喜欢的事情,然后继续您正在做的事情。您可以使用指向函数的指针在C中实现它
您可以从以下内容中获得灵感在不更改调用的情况下,无法捕获标准C中的每个操作。加密之类的东西需要上下文(如密钥)才能工作;这通常会使生活复杂化,但可能
persist\u result()
会自动处理。您将如何处理fseek()
或倒带()
我认为,除非您将I/O操作编写到非标准的C API中,该API允许您干净地执行必要的操作,否则您将陷入一个痛苦的世界。例如,您的代码可能被编写为调用函数,如pr\u fwrite()
,pr\u putc()
,pr\u fprintf()
,pr\u vfprintf()
,pr\u rewind()
,等等—您可能不会将此应用于stdin或stdout—并让它们执行必要的操作
如果我要尝试这个方法,我会采用前缀(pr\uuu
和pr
),并创建一个标题“prstdio.h”
,以代替
,或作为其补充。它可以包含(连同注释和标题保护等):
#包括
//不需要#包括
类型定义结构PRFILE PRFILE;
外部PRFILE*pr_fopen(常量字符*名称,常量字符*模式);
外部内部文件(PRFILE*fp);
外部文件(字符c,文件*fp);
外部大小写入(常量无效*缓冲区、大小大小、大小编号、PRFILE*fp);
外部输入pr_fprintf(PRFILE*fp,char*fmt,…);
外部输入pr_vfprintf(PRFILE*fp、char*fmt、va_列表参数);
外部内部pr_fseek(PRFILE*fp,长偏移量,内部位置);
外部无效pr_倒带(PRFILE*fp);
…
所有需要使用persist\u result()
函数的现有I/O调用将被编写为使用prstdio.h
接口。在您的实现文件中,您实际上定义了结构struct PRFILE
,其中包括文件*
成员以及您需要的任何其他信息。然后编写这些pr*
函数来执行必要的操作,需要持久化结果的代码将更改为在当前使用stdio.h
函数时调用pr*
函数(并使用PRFILE*
类型)
它的优点是简单地符合C标准,并且可以进行移植。此外,对需要使用“持久结果”库的现有代码的更改是非常系统化的
在对主要问题的回答中——最初是对我的一条现已删除的评论(其内容现在已包含在本答案中)——OP提出:
我需要在普通数据写入操作之前进行加密操作。加密上下文已准备好工作。我在考虑在内存上使用磁盘,但是它是ISO的吗?它也可以在Android NDK和iOS中使用吗
到目前为止,您讨论的是加密和写入数据。不要忘记I/O等式的另一半——读取和解密数据。您需要在标题中使用适当的输入函数才能处理该问题。pr_ungect()
函数可能会引起一些有趣的讨论
这里概述的方案将在您可以编写C代码的其他系统上使用。它不依赖任何非标准的东西。这是在C中实现数据隐藏的合理方法。只有prstdio
库的实现文件需要了解PRFILE
结构的内部内容
因为“内存中的磁盘”不是标准C的一部分,使用这种概念的任何代码都必须使用非标准C。您需要仔细考虑它对于便携性的意义。然而,对于<代码> PRSTDIO 库的外部接口可以与这里所描述的相同。除了可能需要一个或多个控制函数来操纵内存中数据的位置之外。或者您可以修改
pr\u fopen()
以获取控制内存管理的额外参数。那将是你的决定。不过,通用I/O接口不需要更改。如果不更改调用,就无法捕获标准C中的每个操作。加密之类的东西需要上下文(如密钥)才能工作;这通常会使生活复杂化,但可能persist\u result()
会自动处理。您将如何处理fseek()
或倒带()
我认为,除非您将I/O操作编写到非标准的C API中,这样您就可以做自己想做的事情,否则您将陷入一个痛苦的世界
#include <stdarg.h>
// No need for #include <stdio.h>
typedef struct PRFILE PRFILE;
extern PRFILE *pr_fopen(const char *name, const char *mode);
extern int pr_fclose(PRFILE *fp);
extern int pr_fputc(char c, PRFILE *fp);
extern size_t pr_fwrite(const void *buffer, size_t size, size_t number, PRFILE *fp);
extern int pr_fprintf(PRFILE *fp, char *fmt, ...);
extern int pr_vfprintf(PRFILE *fp, char *fmt, va_list args);
extern int pr_fseek(PRFILE *fp, long offset, int whence);
extern void pr_rewind(PRFILE *fp);
…