Hi,
I’ve been tasked with trying to figure out why we are getting an error in our log file, the error is “error: End of file”. I’m still fairly new to doing real-world C++ development and I struggle with understanding why the code does what
it does.
The errors in our log file specifically are:
2023.02.20 08:45:49.470[UTC] [19626:140486796130176] TRACE - Process::CmdRunner::AsyncReadStdout<0x7fc594013b20> len = 0
2023.02.20 08:45:49.470[UTC] [19626:140486796130176] TRACE - Process::CmdRunner::AsyncReadStdout<0x7fc594013b20> error: End of file
At a high level, my understanding is that we use Boost Asio to run python scripts where our C++ process will fork a new child process to run these python scripts. What I don’t understand is why the code we have like the below was chosen
to implement that functionality and to handle error handling. I’ve looked at some Asio boost tutorials but I still have gaps between our implementation and the Boost Asio tutorials and documentation.
I’m also wondering why the
a_errCode == boost::asio::error::eof
is not seemingly catching the end of file.
The code in the method CmdRunner::AsyncReadStdout does the following:
void
CmdRunner::AsyncReadStdout(boost::system::error_code
a_errCode,
size_t
a_readSize)
{
DoLOG(TRACE,
"Process::CmdRunner::%s<%p>
len = %zu", __func__,
this, a_readSize);
if ( a_errCode ) {
DoLOG(TRACE,
"Process::CmdRunner::%s<%p>
error: %s", __func__,
this,
a_errCode.message().c_str())
}
if ( a_readSize >
0 ) {
DoLOG(TRACE,
"Process::CmdRunner::%s<%p>
- read this: %zu bytes", __func__,
this, a_readSize)
_stdoutBufList.Copy(_stdoutReadBuf,
a_readSize); // Call user callback to push out bytes
Daemon::Service::DispatchEvent([this]()
{ _cbHandler(_cbCtxt,
false); });
}
else if ( a_errCode ==
boost::asio::error::eof
) { // Read done, call user callback function!
DoLOG(TRACE,
"Process::CmdRunner::%s<%p>
- Child process (%d) STDOUT reached EOF",
__func__, this, _childPid)
_cmdDone = _eofStdout =
true;
_procStdout->close();
_procStderr->close();
Daemon::Service::DispatchEvent([this]()
{ _cbHandler(_cbCtxt,
true); });
}
else { // Async-read more, until EOF seen
_procStdout->async_read_some(boost::asio::buffer(_stdoutReadBuf,
PROC_READ_BUF_SIZE),
[this](boost::system::error_code
ec,
std::size_t
a_readSize)
{
AsyncReadStdout(ec, a_readSize);
});
}
}
Any hints or specific links to look at to further clarify my understanding would be appreciated.
Thanks!
Chach