libadc-cxx 1.0.0
Structured logging for scientific computing
Loading...
Searching...
No Matches
outpipe.ipp
Go to the documentation of this file.
1#include <vector>
2#include <array>
3#include <iostream>
4#include <sstream>
5#include <ostream>
6#include <string>
7#include <cstdio>
8
9namespace adc {
10
11struct pipe_data {
12 std::string output;
13 int rc;
14 friend std::ostream &operator<<(std::ostream &os, const pipe_data &pdata) {
15 os << "proc rc: " << pdata.rc << " output: " << pdata.output;
16 return os;
17 }
18 bool operator==(const pipe_data &rhs) const {
19 return output == rhs.output &&
20 rc == rhs.rc;
21 }
22 bool operator!=(const pipe_data &rhs) const {
23 return !(rhs == *this);
24 }
25};
26
27class out_pipe {
28public:
29 static pipe_data run(const std::string &proc) {
30 int rc = 0;
31 std::array<char, 8192> scratch {};
32 std::string text;
33 FILE *pipe = popen(proc.c_str(), "r");
34 if (pipe == nullptr) {
35 throw std::runtime_error("popen() fails: " + proc);
36 }
37 try {
38 std::size_t inbytes;
39 while ((inbytes = std::fread(scratch.data(), sizeof(scratch.at(0)), sizeof(scratch), pipe)) != 0) {
40 text += std::string(scratch.data(), inbytes);
41 }
42 } catch (...) {
43 pclose(pipe);
44 throw;
45 }
46 int res = pclose(pipe);
47 rc = WEXITSTATUS(res);
48 return pipe_data{text, rc};
49 }
50
51};
52
53} // end adc
54
55#ifdef MAIN_out_pipe
56int main() {
57 pipe_data lscpu = out_pipe::run("lscpu -J");
58 std::cout << lscpu.rc << std::endl;
59 std::cout << lscpu.output << std::endl;
60 return 0;
61}
62#endif
63#ifdef MAIN_numactl
64#if 0
65available: 8 nodes (0-7)
66node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 112 113 114 115 116 117 118 119 120 121 122 123 124 125
67node 0 size: 31699 MB
68node 0 free: 8914 MB
69node distances:
70#endif
71
72int main() {
73 static bool shell_done;
74 int numa_json = -1;
75 if (!shell_done) {
76 size_t numa_node_count = 0;
77 std::vector<std::string> sizes;
78 std::vector<std::string> cpulist;
79 shell_done = 1;
80 pipe_data numactl = out_pipe::run("numactl -H");
81 if (! numactl.rc) {
82 std::string line;
83 std::istringstream nss(numactl.output);
84 while (std::getline(nss, line)) {
85 size_t cp = line.find(':');
86 std::string name = line.substr(0, cp);
87 if (name == "available") {
88 std::istringstream iss(line.substr(cp+1));
89 iss >> numa_node_count;
90 }
91 if (name.substr(name.length()-4) == "cpus" ) {
92 cpulist.push_back(line.substr(cp+2));
93 }
94 if (name.substr(name.length()-4) == "size" ) {
95 sizes.push_back(line.substr(cp+2));
96 }
97 if (name.substr(name.length()-4) == "nces" )
98 break; // stop on "node distances:"
99 }
100 if (sizes.size() != numa_node_count || cpulist.size() != numa_node_count)
101 return numa_json; // inconsistent data
102 std::cout << numa_node_count << std::endl;
103 for (size_t i = 0; i < numa_node_count; i++) {
104 std::cout << sizes[i] <<std::endl;
105 std::cout << cpulist[i] <<std::endl;
106 }
107 }
108 }
109 return numa_json;
110}
111#endif
static pipe_data run(const std::string &proc)
Definition outpipe.ipp:29
int main(int argc, char **argv)
Definition adc.hpp:75
std::string output
Definition outpipe.ipp:12
friend std::ostream & operator<<(std::ostream &os, const pipe_data &pdata)
Definition outpipe.ipp:14
bool operator!=(const pipe_data &rhs) const
Definition outpipe.ipp:22
bool operator==(const pipe_data &rhs) const
Definition outpipe.ipp:18