cepgen is hosted by Hepforge, IPPP Durham
CepGen N/A
Central exclusive processes event generator
StreamCollector.h
Go to the documentation of this file.
1/*
2 * CepGen: a central exclusive processes event generator
3 * Copyright (C) 2024 Laurent Forthomme
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef CepGen_Utils_StreamCollector_h
20#define CepGen_Utils_StreamCollector_h
21
22#ifdef _MSC_VER
23#include <io.h>
24#define popen _popen
25#define pclose _pclose
26#define stat _stat
27#define dup _dup
28#define dup2 _dup2
29#define fileno _fileno
30#define close _close
31#define pipe _pipe
32#define read _read
33#define eof _eof
34#else
35#include <unistd.h>
36#endif
37#include <fcntl.h>
38#include <stdio.h>
39
40#include <array>
41#include <mutex>
42#include <string>
43#include <thread>
44
45#ifndef STD_OUT_FD
46#define STD_OUT_FD (fileno(stdout))
47#endif
48
49#ifndef STD_ERR_FD
50#define STD_ERR_FD (fileno(stderr))
51#endif
52
53namespace cepgen::utils {
55 public:
56 explicit StreamCollector(std::string&);
58
59 private:
60 static int secure_dup(int src);
61 static void secure_pipe(int* pipes);
62 static void secure_dup2(int src, int dest);
63 static void secure_close(int& fd);
64
65 std::array<int, 2> pipes_{0, 0};
66 int old_stdout_{0}, old_stderr_{0};
67 std::mutex mutex_;
68 std::string& captured_stream_;
69 };
70} // namespace cepgen::utils
71
72#endif
Collection of utilities.