blob: 900c92c3c1c389bdd38e3068ba8643eff4010b4d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ProcessStat.h"
#include <sstream>
namespace org::apache::nifi::minifi::extensions::procfs {
std::optional<ProcessStatData> ProcessStatData::parseProcessStatFile(std::istream& stat_file) {
std::stringstream stat_stream;
copy(std::istreambuf_iterator<char>(stat_file),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(stat_stream));
ProcessStatData process_stat_data;
stat_stream >> process_stat_data.pid_;
std::string stat_stream_string = stat_stream.str();
size_t comm_start = stat_stream_string.find_first_of('(');
size_t comm_end = stat_stream_string.find_last_of(')');
if (comm_start == std::string::npos || comm_end == std::string::npos)
return std::nullopt;
process_stat_data.comm_ = stat_stream_string.substr(comm_start+1, comm_end-comm_start-1);
stat_stream.seekg(comm_end+2); // seek to the start of the next field (after the space that follows (<comm>))
stat_stream >> process_stat_data.state_ >> process_stat_data.ppid_ >> process_stat_data.pgrp_ >> process_stat_data.session_ >> process_stat_data.tty_nr_ >> process_stat_data.tpgid_
>> process_stat_data.flags_ >> process_stat_data.minflt_ >> process_stat_data.cminflt_ >> process_stat_data.majflt_ >> process_stat_data.cmajflt_ >> process_stat_data.utime_
>> process_stat_data.stime_ >> process_stat_data.cutime_ >> process_stat_data.cstime_ >> process_stat_data.priority_ >> process_stat_data.nice_ >> process_stat_data.num_threads_
>> process_stat_data.itrealvalue_ >> process_stat_data.starttime_ >> process_stat_data.vsize_ >> process_stat_data.rss_ >> process_stat_data.rsslim_ >> process_stat_data.startcode_
>> process_stat_data.endcode_ >> process_stat_data.startstack_ >> process_stat_data.kstkesp_ >> process_stat_data.kstkeip_ >> process_stat_data.signal_ >> process_stat_data.blocked_
>> process_stat_data.sigignore_ >> process_stat_data.sigcatch_ >> process_stat_data.wchan_ >> process_stat_data.nswap_ >> process_stat_data.cnswap_ >> process_stat_data.exit_signal_
>> process_stat_data.processor_ >> process_stat_data.rt_priority_ >> process_stat_data.policy_ >> process_stat_data.delayacct_blkio_ticks_ >> process_stat_data.guest_time_
>> process_stat_data.cguest_time_ >> process_stat_data.start_data_ >> process_stat_data.end_data_ >> process_stat_data.start_brk_ >> process_stat_data.arg_start_
>> process_stat_data.arg_end_ >> process_stat_data.env_start_ >> process_stat_data.env_end_ >> process_stat_data.exit_code_;
if (stat_stream.fail())
return std::nullopt;
return process_stat_data;
}
} // namespace org::apache::nifi::minifi::extensions::procfs