This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: sdtin/stdout/stderr redirection


Jifl,

You are right. It is opened in full buffering mode. A call to setvbuf(stdout, NULL, _IOLBF, BUFSIZ) works
Thanks.


Another question:
Why the open mode #define like O_CREAT, O_RD_ONLY..... are not the same definition than in Linux
Same question for the st_mode in struct stat (VxWorks and Linux has the same definition)
It would make my life easier.....


I notice that eCos manage the binary mode for fopen but somehow it is lost along the road when calling open (which triggers my filesystem rpcfs_open routine)
Is there any intention to define O_BINARY


Phil.

Jonathan Larmour wrote:

Philippe Vandermersch wrote:

Jifl.

I liked your proposal because I do not have to deal with C++ but :

1)
fclose( stdout ) failed :
ASSERT FAIL: <4>dlmalloc.cxx[765]do_check_chunk() (cyg_uint8 *)p >= arenabase
ASSERT FAIL: <4>dlmalloc.cxx [ 765] do_check_chunk() (cyg_uint8 *)p >= arenabase
TRACE: <4>sched.cxx [ 705] disinherit_priority() }}RETURNING UNSET!
TRACE: <4>mutex.cxx [ 447] unlock()


Bugger, I forgot about that. fclose() is trying to free stdin, but stdin was not allocated off the heap.

2)
If I do not close it and do simply : stdout = fdopen(fd_out , "w" ) seems to succeed but printf does print anything


Ah... my guess is that the default buffering mode is full buffering, not line buffering, so you would have to set the buffering mode to _IOLBF with setvbuf().

If it's not that I'm afraid I don't know off-hand what it could be. fdopen() calles fopen_inner() in fopen.cxx, which calls a constructor just like you do below.


3)
To make it work, I had to do this in C++:

Cyg_StdioStream *StdoutStream = new Cyg_StdioStream( fd_out, Cyg_StdioStream::CYG_STREAM_WRITE, false, false, _IOLBF );
if(StdoutStream == NULL) return( ENOMEM );
stdout = (FILE *)StdoutStream;


It also works for stdin,stderr.


That's good. Although if you had a moment, it would be nice if you could have a quick poke around to see why 2) didn't work, and in particular if using setvbuf(stdout, NULL, _IOLBF, BUFSIZ); is all it takes.

Jifl





-- Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos and search the list archive: http://sources.redhat.com/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]