[Openmcl-devel] stdout from called C funcs while using IDE

Paul Krueger plkrueger at comcast.net
Mon Apr 6 16:48:58 PDT 2009

Thanks, that was a good explanation. I can understand why you might  
not redirect fd 2 (normally stderr for C functions) for the reasons  
you mentioned (you would get all sorts of random messages). I suppose  
you can't guarantee that fd 1 doesn't also get that sort of output and  
I can't speak for the various library functions that are out there,  
but I would normally expect the use of fd 1 by OS functions (other  
than those like printf which are explicitly intended to use it) to be  
pretty minimal. So I would mildly lobby for a redirection of fd 1  
(only) to AltConsole in order to accommodate the simple use of printf  
in called C functions. If not, it might be useful for someone to add a  
comment on the web page I referenced to explain where the output from  
the example functions will go when executed under the IDE. Or I  
suppose the examples could be made more complex by passing in the  
AltConsole fd to the C functions. I suspect you may have higher  
priorities, so consider all this just a mild suggestion if it's  

On Apr 6, 2009, at 6:01 PM, Gary Byers wrote:

> In an OSX GUI application, fd 0 is connected to /dev/null and fd's 1  
> and 2
> are redirected to a logging mechanism.  The C runtime library  
> initializes
> the standard FILE*s (stdin, stdout, stderr) to use these file  
> descriptors
> (regardless of whether the application is a GUI or command-line  
> application.)
> The lisp also initializes lisp streams that use these file  
> descriptors.
> One of them - an output stream associated with fd 1 - happens to be
> the value of CCL::*STDOUT* - but it's a very different kind of  
> object than
> (but with a similar function to) C's "stdout".
> The initial lisp thread - the thread that basically runs the Cocoa
> event loop - uses input and output streams that are ordinarily  
> associated
> with fd's 0 and 1.  That thead shouldn't do much conventional I/O  
> under
> normal circumstances, but it's very useful for it to be able to do
> at least simple I/O for debugging (rather than just having backtraces
> and error messages go to the logging device/console.)  For the last
> few months, we've basically been using a little Cocoa program  
> (AltConsole)
> and arranging that that kind of output goes (via a socket or pipe or
> whatever) to that program.  (We also use #_dup2 to make fd 0  
> equivalent
> to that socket/pipe, so it's possible to do simple kinds of  
> interactive
> things - like a simple break loop - in that AltConsole window.)
> The lisp kernel also needs to do at least some simple kinds of  
> interactive
> I/O (in order to run the kernel debugger, which is at least slightly
> better than nothing.)  All of the text output that the kernel does
> uses a C stream ("dbgout") that's initially assocated with fd 2; when
> the IDE startup code creates a socket to communicate with AltConsole,
> we tell the lisp kernel to associate our end of the socket with the
> C "dbgout" stream.
> Lots of random library functions write diagnostic messages to fd 2
> (and it's possible that some of this stuff uses fd 1 as well.) We
> intentionally don't try to redirect that to AltConsole, because we
> don't want the AltConsole window to pop up and announce things like:
> SystemFlippers: didn't consume all output from ...
> There's no good way of telling whether those "third party" messages
> will be interesting or not, but when we tried to use other mechanisms
> to capture process-wide diagnostic output, people complained about
> seeing windows popping up to describe things that most people don't
> care about or even understand.
> It's certainly possible that some third-party diagnostic messages
> could be intersting enough to warrant having the AltConsole window
> pop up to describe them (and it's also possible that some messages
> coming from lisp/the lisp kernel aren't), but we're intentionally
> not redirecting fds 1 and 2 (on the assumption that anyone who
> knows what SystemFlippers are can probably look in the logfiles
> if they want to know whether all input was consumed.)
> On Mon, 6 Apr 2009, Paul Krueger wrote:
>> I'm running the Cocoa IDE for CCL under Leopard. While working  
>> through
>> some of the foreign function examples shown on http://ccl.clozure.com/manual/chapter12.10.html
>> I discovered that even though everything works as advertised from a
>> CCL command line, when using the IDE the output from the C functions
>> is sent to the system console rather than to either the listener
>> window or the AltConsole window. I think maybe this is because the
>> function try-connecting-to-altconsole in start.lisp uses a dup2 call
>> to change stdin (fd 0), but doesn't actually change stdout (fd 1). It
>> only changes the lisp symbol ccl::*stdout*. I tried to make what I
>> thought was a simple change to fix this by adding a second #_dup2  
>> call
>> for fd 1, but when I tried to rebuild the IDE from the CCL command
>> line it aborted while trying to save the new application, so I  
>> suspect
>> there is something more subtle happening during the build.
>> This isn't really a problem for me given what I need to do, so I'm  
>> not
>> going to spend any more time chasing it down. But I thought I'd
>> mention it in case printf to stdout from a called C function is  
>> needed
>> by someone.
>> Incidentally, there is a small typo on http://ccl.clozure.com/manual/chapter12.10.html
>> . The include statement in the example code should be "#include
>> <stdio.h>" rather than "#include <stdio.>". Most any C programmer
>> would figure that out pretty quickly I'm sure.
>> Paul
>> _______________________________________________
>> Openmcl-devel mailing list
>> Openmcl-devel at clozure.com
>> http://clozure.com/mailman/listinfo/openmcl-devel

More information about the Openmcl-devel mailing list