【问题标题】:Running libsandbox运行 libsandbox
【发布时间】:2025-12-19 04:30:07
【问题描述】:

我目前正在开发一个在线 C/C++/汇编编译器,我偶然发现了一个名为 libsandbox 的好软件。这使我能够运行在线编写的代码,对其进行编译并拦截系统调用(如果已进行)。

首先,我是 Linux 环境的新手。我已经下载了 tar.gz,解压,配置并安装。这运行没有任何错误,但现在我很难运行它。我应该如何在这个沙箱中运行 C/C++ 程序?我必须向它提供 .c/.cpp 文件吗?编译后的可执行文件?

这可能是一个非常愚蠢的问题。我在互联网上搜索了如何做到这一点,并阅读了包含的自述文件,但他们没有给我任何线索。

提前致谢!

【问题讨论】:

    标签: c++ c assembly


    【解决方案1】:

    沙盒仅适用于 linux。您必须首先使用库函数实际创建沙箱,然后告诉沙箱运行您的程序。

    此 python 示例展示了如何从 python 中执行此操作。 “#targeted program”行显示了您将在哪里指定实际应用程序的名称。

    def main(args):
        # sandbox configuration
        cookbook = {
            'args': args[1:],               # targeted program
            'stdin': sys.stdin,             # input to targeted program
            'stdout': sys.stdout,           # output from targeted program
            'stderr': sys.stderr,           # error from targeted program
            'quota': dict(wallclock = 30000,# 30 sec
                          cpu = 2000,       #  2 sec
                          memory = 8388608, #  8 MB
                          disk = 1048576)}  #  1 MB
    
    # create a sandbox instance and execute till end
    msb = MiniSandbox(**cookbook)
    msb.run()
    # verbose statistics
    sys.stderr.write("result: %(result)s\ncpu: %(cpu)dms\nmem: %(mem)dkB\n" % \
        msb.probe())
    return os.EX_OK
    

    我建议去 libsandbox 下载页面并在那里获取完整的 sample2.py 文件,然后使用 python 脚本运行沙箱。这比制作一个 C++ 或 C 程序来为你做这件事要容易。

    所以...

    1. 制作您的 C 或 C++ 程序。不要将其链接到 LIBSANDBOX。

    2. 确保您已安装 python。

    3. 从 libsandbox 页面运行示例 python 脚本。

    4. python 脚本将为您加载 libsandbox。然后它将运行您在沙箱中构建的程序。

    简单。

    【讨论】:

    • 感谢您的回答!我将尝试运行 Python 脚本并让您知道它是否有效! :)
    • 1
    【解决方案2】:

    完全同意@user1401452 的回答。关于 libsandbox 的更多提示,

    1. 沙盒的二进制可执行文件最好静态链接,因为加载共享库涉及默认禁止的系统调用,如 SYS_open()。
    2. 编写一个直接调用核心沙盒库(即 libsandbox)的 C/C++ 程序也是可行的——尽管比使用 Pythonic 包装器(即 pysandbox)要复杂一些。示例 python 脚本的 ANSI C 等效项(即 sample2.c)现在可在 libsandbox 的主页上找到。
    3. 示例程序仅演示了 libsandbox 的一些基本功能。实用的沙盒解决方案通常需要具有更复杂规则的自定义沙盒策略。

    免责声明:我是libsandbox的作者

    【讨论】:

      【解决方案3】:

      简短而通用的答案是:要使用 libanything,您编写一个利用该库的程序 - 您将 #include &lt;<em>anything.h</em>&gt; 放入源代码并使用 -l<em>anything</em> 开关链接。您不应该找到任何可执行文件,除非它是测试套件或库的示例程序。

      由于某种原因,我无法找到“libsandbox”,因此我的回复可能非常不准确。

      【讨论】: