小编qsc*_*qsc的帖子

如何设计具有许多配置选项的程序?

假设我有一个包含大量配置选项的程序.用户可以在配置文件中指定它们.我的程序可以解析这个配置文件,但它应该如何在内部存储并传递选项?

就我而言,该软件用于执行科学模拟.大约有200个选项,其中大多数具有合理的默认值.通常,用户只需指定十几个左右.我面临的困难是如何设计我的内部代码.许多需要构造的对象依赖于许多配置选项.例如,一个对象可能需要几个路径(用于存储数据的位置),一些需要传递给对象将调用的算法的选项,以及一些由对象本身直接使用的选项.

这导致需要构造大量参数的对象.此外,由于我的代码库处于非常活跃的开发阶段,因此通过调用堆栈并将新的配置选项一直传递到需要的地方是一件非常大的痛苦.

防止这种痛苦的一种方法是拥有一个可以在代码中的任何地方自由使用的全局配置对象.我并不特别喜欢这种方法,因为它导致函数和类不采用任何(或只有一个)参数,并且读者不清楚函数/类处理什么数据.它还可以防止代码重用,因为所有代码都依赖于巨大的配置对象.

任何人都可以给我一些关于如何构建这样的程序的建议吗?

以下是我对配置选项传递样式的一个示例:

class A:
    def __init__(self, opt_a, opt_b,  ..., opt_z):
        self.opt_a = opt_a
        self.opt_b = opt_b
        ...
        self.opt_z = opt_z

    def foo(self, arg):
        algo(arg, opt_a, opt_e)
Run Code Online (Sandbox Code Playgroud)

以下是全局配置样式的示例:

class A:
    def __init__(self, config):
        self.config = config

    def foo(self, arg):
        algo(arg, config)
Run Code Online (Sandbox Code Playgroud)

示例是在Python中,但我的问题代表任何类似的编程语言.

python api coding-style

13
推荐指数
1
解决办法
1200
查看次数

如何拦截对文件系统的调用

我有兴趣拦截与文件系统相关的所有系统调用,而不是让我自己的代码运行。例如,调用 creat、write、close、lseek、getcwd 等。我的目标是创建一个像 execve 这样的函数,它将所有文件 I/O 从生成的程序捕获到由调用进程管理的内存文件系统。这样,调用程序就可以在没有文件系统开销的情况下检查输出。

我的用例是使用没有 API 或库的大型数值模拟程序。这些程序仅通过输入和输出文件进行通信。如果这些文件很大,则仅执行 I/O 就可能占用大部分运行时间。在某些具有超级用户权限的计算机上,可以设置位于 RAM 中的文件系统(例如 Linux 上的 tmpfs),但没有超级用户权限,或者以某种方式配置的机器这是不可能的.

我知道使用 LD_PRELOAD 可以调用自定义代码而不是 libc 中的函数。但是,这只适用于动态链接的程序,它不能回答在调用程序(我想托管内存文件系统)和被调用者之间应该如何执行 IPC 的问题。这种方法的问题是如何最好地执行 IPC。我应该使用管道、unix 域套接字还是一些共享内存?

我还将 ptrace 视为拦截系统调用的一种方式。这似乎可行,但我对这种方法有两个问题。首先,如何防止实际的系统调用发生(而不是像我在一些示例中看到的那样仅修改系统调用的参数)。其次,ptrace 是否允许高性能读取被调用者的内存空间?

c linux operating-system

5
推荐指数
1
解决办法
1092
查看次数

标签 统计

api ×1

c ×1

coding-style ×1

linux ×1

operating-system ×1

python ×1