In mex files, where does output to stdout and stderr go?

26 Ansichten (letzte 30 Tage)
Oliver Woodford
Oliver Woodford am 5 Jun. 2014
Kommentiert: A.B. am 3 Apr. 2020
If I link an external library to a mex file, and this library sends text output to stdout or stderr, what does MATLAB do with this output? Is there any way of saving it?

Antworten (3)

Oliver Woodford
Oliver Woodford am 12 Mai 2015
Bearbeitet: Oliver Woodford am 12 Mai 2015
In a C++ mex file you can output std::cout to the command line, by putting the following code somewhere in your mex file:
class mystream : public std::streambuf
{
protected:
virtual std::streamsize xsputn(const char *s, std::streamsize n) { mexPrintf("%.*s", n, s); return n; }
virtual int overflow(int c=EOF) { if (c != EOF) { mexPrintf("%.1s", &c); } return 1; }
};
class scoped_redirect_cout
{
public:
scoped_redirect_cout() { old_buf = std::cout.rdbuf(); std::cout.rdbuf(&mout); }
~scoped_redirect_cout() { std::cout.rdbuf(old_buf); }
private:
mystream mout;
std::streambuf *old_buf;
};
static scoped_redirect_cout mycout_redirect;
  1 Kommentar
Oliver Woodford
Oliver Woodford am 12 Mai 2015
This will actually redirect output to std::out in all other mex files too, until the original mex file is cleared. To avoid this, you can place this:
scoped_redirect_cout mycout_redirect;
at the top of the mex function, and remove the line:
static scoped_redirect_cout mycout_redirect;
from the mex file. However, this approach carries an overhead per mex call.

Melden Sie sich an, um zu kommentieren.


Andrew Stevens
Andrew Stevens am 11 Feb. 2018
Bearbeitet: Andrew Stevens am 11 Feb. 2018
Additionally to Olivers solution:
  • In R2016 under Linux it would seem that mexPrintf itself uses iostream (internally). You have to switch the stream buffer back to the original for the mexPrintf call to avoid a stack overflow.
  • In R2016 under Linux at least mexPrintf appears to check the thread from which it is being called (presumably because mx/mex API is not thread safe). If the calling stack is not the same as that used to enter mexFunction it merely logs "Error writing to output stream". The test (or is it a breakage?) alas is rather conservative: it triggers even if the "thread" is actually just a lightweight coroutine library like quickthreads is being used (e.g. SystemC).
The work-around is to buffer the output in the custom streambuf and flush only from the calling thread.

Tianyang Li
Tianyang Li am 6 Jan. 2015
If you start maltab using -nojvm then stdout and stderr are visible.

Kategorien

Mehr zu Write C Functions Callable from MATLAB (MEX Files) finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by