## 4. Run the Sandbox

In the previous sections, you prepared the sandboxed environment, policy, and
executor and Sandboxee. The next step is to create the `Sandbox2` object and run
it.

### Run synchronously

The sandbox can run synchronously, thus blocking until there is a result. The
code snippet below demonstrates the instantiation of the `Sandbox2` object and
its synchronous execution. For a more detailed example, see
[static](https://developers.google.com/code-sandboxing/sandbox2/examples#static).

    #include "sandboxed_api/sandbox2/sandbox2.h"

    sandbox2::Sandbox2 s2(std::move(executor), std::move(policy));
    sandbox2::Result result = s2.Run();  // Synchronous
    LOG(INFO) << "Result of sandbox execution: " << result.ToString();

### Run asynchronously

You can also run the sandbox asynchronously, thus not blocking until there is a
result. This is useful, for instance, when communicating with the Sandboxee. The
code snippet below demonstrates this use case, for more detailed examples see
[crc4](https://developers.google.com/code-sandboxing/sandbox2/examples#crc4) and
[tool](https://developers.google.com/code-sandboxing/sandbox2/examples#tool).

    #include "sandboxed_api/sandbox2/sandbox2.h"

    sandbox2::Sandbox2 s2(std::move(executor), std::move(policy));
    if (s2.RunAsync()) {
      // Communicate with sandboxee, use s2.Kill() to kill it if needed
      // ...
    }
    Sandbox2::Result result = s2.AwaitResult();
    LOG(INFO) << "Final execution status: " << result.ToString();