On May 29, 2008, at 1:29 AM, Denis Bohm wrote:

When another application has a device file open and I try to use NSFileHandle fileHandleForUpdatingAtPath to open the same device file, the call just seems to hang and never return. The API documentation doesn't say what should happen in this case. Does anyone know why it isn't returning? What I would like is for it to return with nil or throw an exception...

Cocoa is ultimately using the BSD/POSIX API of Mac OS X to perform file operations. This file access API can operate in either blocking or non-blocking modes. From what you describe, I guess it's using the blocking mode. In your case it's blocking for one of two reasons: the device driver to which the device file provides access can only support one client at a time, or the other application has established an advisory lock on the file and Cocoa is respecting that advisory lock.

See Technical Note TN2037, "Exclusive File Access in Mac OS X" <http://developer.apple.com/technotes/tn/tn2037.html >, for an explanation of advisory locking and Cocoa's use of it.

In either case, you may need to use the BSD/POSIX API (e.g. the open() system call) yourself to work around this blocking behavior. Once you obtain a file descriptor, you can then create an NSFileHandle with one of the initWithFileDescriptor:... methods. Be sure to follow the advice in the above technote and respect advisory locking in your use of the BSD/POSIX API. Of course, you'll need a strategy for how to handle the failure to open the file because it was already opened by another application.

Cheers,
Ken
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to