构建具有强制限制的操作系统层

Building an OS Layer with enforced restrictions?

本文关键字:操作系统 构建      更新时间:2023-10-16

我试图在一个项目中构建一个操作系统层,为其他源代码提供与操作系统无关的功能。例如,我可能有像os_calloc、os_free等函数。我不认为这些是非常依赖于操作系统的,但请随意考虑更好的例子。

目前我们的系统是这样设置的:

#ifdef WINDOWS
void * os_calloc(){
//Windows implementation
}
void * os_free(){
//Windows implementation
}
#endif
#ifdef LINUX
void * os_calloc(){
//Linux implementation
}
void * os_free(){
//Linuximplementation
}
#endif

现在,这对我来说不太合适。主要原因是,理论上我们想要定义一组与操作系统无关的函数,并且在每个系统上都有完全相同的函数集,只是实现不同。

这种严格关系可以通过任何编程模式强制执行吗?也就是说,规则说"每个操作系统实现必须实现这组函数,不多不少"。

编辑:让我澄清一下,我问的是如何通过设计/编程模式来实现这种关系,而不是通过链接到其他独立于操作系统的库。

如果你想执行一些东西,那么创建一个名为"IOsInterface"(或类似的)的接口类来描述所需的接口。任何实际的操作系统实现都必须履行这个契约。继承接口类并实现所有虚方法。

class IOsInterface
{
    public:
        virtual ~IOsInterface() {}
        virtual void * calloc() = 0;
};

class OsWindowsImpl : public IOsInterface
{
    public:
        virtual void * calloc()
        {
            //Windows implementation
        }
};

创建一个实例(Singleton,你不能做静态虚拟),并使用它作为使用操作系统方法的功能的编程接口。

使用了本地的os独立层(Windows, Linux, Solaris Sparc, Solaris X86,以及每个层的32位和64位实现),但是,请仔细考虑您正在做的事情…Boost, QT, APR,所有这些都是非常可行的选择。我认为,只有当你的公司有严格的政策,所有的东西都必须在内部创建时,这才是一个好主意。

已经有c++库提供了这个功能。例如Qt的QtCore部分

是的,它可以这样工作。但是为什么要发明轮子呢?这就是Apache可移植运行时所做的。(该网站似乎正在关闭。)APR提供的一些与操作系统无关的东西(来自维基百科):

  • 内存分配和内存池功能
  • 原子操作
  • 动态库处理
  • 文件I/O
  • 命令参数解析
  • 哈希表和数组
  • <
  • Mmap功能/gh>
  • 网络套接字和协议
  • 线程、进程和互斥锁功能
  • 共享内存功能<
  • 时间例程/gh>
  • 用户和组ID业务