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
Internal Use - Confidential
_______________________________________________
Boost-users mailing list
[email protected]
https://lists.boost.org/mailman/listinfo.cgi/boost-users