AsmGrader 0.0.0
Loading...
Searching...
No Matches
subprocess.hpp
Go to the documentation of this file.
1#pragma once
2
7
8#include <chrono>
9#include <cstddef>
10#include <optional>
11#include <string>
12#include <vector>
13
14#include <sys/types.h>
15#include <time.h>
16#include <unistd.h>
17
18namespace asmgrader {
19
21{
22public:
25 explicit Subprocess(std::string exec, std::vector<std::string> args);
26 virtual ~Subprocess();
27 Subprocess(Subprocess&&) noexcept;
28 Subprocess& operator=(Subprocess&&) noexcept;
29
30 template <typename Rep, typename Period>
31 Result<std::string> read_stdout(const std::chrono::duration<Rep, Period>& timeout) {
32 return read_stdout_poll_impl(std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count());
33 }
34
36
38 const std::string& get_full_stdout();
39
40 Result<void> send_stdin(const std::string& str);
41
42 // Forks the current process to start a new subprocess as specified
43 virtual Result<void> start();
44
45 // Blocks until exit. An alias for ``wait_for_exit(A VERY LONG TIME)``
46 int wait_for_exit();
47
48 // Blocks until exit or timeout
49 virtual Result<int> wait_for_exit(std::chrono::microseconds timeout);
50
52 bool is_alive() const;
53
57
58 pid_t get_pid() const { return child_pid_; }
59
60 std::optional<int> get_exit_code() const { return exit_code_; }
61
63 virtual Result<void> kill();
64
65 virtual Result<void> restart();
66
67protected:
68 // Allow derived classes to customize initialization
69 Subprocess() = default;
70 virtual Result<void> create(const std::string& exec, const std::vector<std::string>& args);
71
72 virtual Result<void> init_child();
73 virtual Result<void> init_parent();
74
75private:
76 pid_t child_pid_{};
79 linux::Pipe stdin_pipe_{};
80 linux::Pipe stdout_pipe_{};
81
82 std::string stdout_buffer_;
83 std::size_t stdout_cursor_{};
84
85 Result<std::string> read_stdout_poll_impl(int timeout_ms);
86
88 Result<void> read_stdout_impl();
89
90 std::optional<int> exit_code_;
91
92 std::string exec_;
93 std::vector<std::string> args_;
94};
95
96} // namespace asmgrader
std::variant wrapper for a partial implementation of C++23's expected type
Definition expected.hpp:34
A trivially-movable, but non-copyable type.
Definition class_traits.hpp:14
Definition subprocess.hpp:21
Result< void > send_stdin(const std::string &str)
Definition subprocess.cpp:228
virtual ~Subprocess()
Definition subprocess.cpp:37
pid_t get_pid() const
Definition subprocess.hpp:58
virtual Result< void > create(const std::string &exec, const std::vector< std::string > &args)
Definition subprocess.cpp:235
const std::string & get_full_stdout()
Get all stdout since the program has launched.
Definition subprocess.cpp:200
int wait_for_exit()
Definition subprocess.cpp:57
std::optional< int > get_exit_code() const
Definition subprocess.hpp:60
virtual Result< void > start()
Definition subprocess.cpp:53
Result< void > close_pipes()
Close stdout and stdin pipes to child Useful for when the child is blocking on a read to stdin.
Definition subprocess.cpp:126
Result< std::string > read_stdout(const std::chrono::duration< Rep, Period > &timeout)
Definition subprocess.hpp:31
Result< std::string > read_stdout()
Definition subprocess.cpp:186
Subprocess & operator=(Subprocess &&) noexcept
Definition subprocess.cpp:149
bool is_alive() const
Whether child process is alive.
Definition subprocess.cpp:159
virtual Result< void > init_parent()
Definition subprocess.cpp:270
virtual Result< void > init_child()
Definition subprocess.cpp:257
virtual Result< void > restart()
Definition subprocess.cpp:87
virtual Result< void > kill()
Manually kill subprocess with SIGKILL.
Definition subprocess.cpp:74
Definition asm_buffer.hpp:19
Expected< T, ErrorKind > Result
Definition error_types.hpp:22
Definition linux.hpp:289