• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Problem with redirecting stdout
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Problem with redirecting stdout


  • Subject: Problem with redirecting stdout
  • From: Edmond Ho <email@hidden>
  • Date: Tue, 9 Nov 2010 18:48:44 -0500

Hello all,

I am having some trouble with capturing and redirecting stdout in my Cocoa
application. A little bit of background: My app has an embedded scripting
language interpreter, and I would like to redirect stdout in order to
display the results of executed scripts in an NSTextView.

I've followed the approach described in the solution to StackOverflow
question: http://stackoverflow.com/questions/2406204

To summarize, I use dup2() to "bind" stdout to my own NSPipe, and then add
an NSNotification observer to listen for an
NSFileHandleReadCompletionNotification on the NSPipe; the notification
callback then reads the NSPipe. NSFileHandle readInBackgroundAndNotify is
used to asynchronously read the data.

This approach works, for the most part -- when executed scripts print only a
small amount of data to stdout, my app redirects the output to an NSTextView
successfully. However, when executed scripts print a large amount of data to
stdout, the app hangs.

I think the problem is that the pipe buffer is not being flushed/read when
it's full; when the pipe is full, the script interpreter then is blocked
because it's waiting for the pipe to empty so that it can write.

I've also tried using an pseudo-tty via openpty() instead of an NSPipe, but
I get the same problem: The app hangs when too much output is sent to stdout
by an executing script.

I'm sure that what I want to do is possible -- after all, the Xcode debugger
console has no problems displaying stdout when running the same script that
hangs my app.

I guess my question is: How do I deal with a large amount of data that's
printed to stdout in this situation? Is there some configuration I can use
to change the buffering behavior (I've read elsewhere that stdout is
block-buffered by default)? Is there a way to force NSFileHandle
readInBackgroundAndNotify to read the pipe more frequently? Or is there
something else?

Thanks very much in advance,
Edmond
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Problem with redirecting stdout
      • From: Dave Keck <email@hidden>
    • Re: Problem with redirecting stdout
      • From: Ken Thomases <email@hidden>
  • Prev by Date: Pause during drawing
  • Next by Date: ABPeoplePickerProblems
  • Previous by thread: Re: Pause during drawing
  • Next by thread: Re: Problem with redirecting stdout
  • Index(es):
    • Date
    • Thread