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中实现它


    您可以从以下内容中获得灵感

    您正在寻找的是。 当函数被调用时,实际上您可以首先捕获该调用,做任何您喜欢的事情,然后继续您正在做的事情。您可以使用指向函数的指针在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);
    …