On Sun, Aug 3, 2008 at 5:12 PM, Andrew Farmer <[EMAIL PROTECTED]> wrote:
> On 03 Aug 08, at 14:00, Steve Cronin wrote:
>>
>> I am trying to simply restart my app.  To my dismay, I cannot find a way
>> to do this in Cocoa.
>> Please enlighten me if I have failed to understand something!!
>>
>> After perusing the archives, what makes the most sense to me is to launch
>> a detached shell that executes a simple AppleScript.
>> The script has a delay of 2 seconds and then simply does a 'launch'.
>
> You're overcomplicating things.
>
> int main(int argc, char **argv) {
>        if(fork() || fork()) exit(0);
>        sleep(2);
>        execl(argv[1], argv[1], NULL);
>        exit(1);
> }
>
> Launch this with a single argument - the path to your application's
> executable. It'll background itself, sleep two seconds, and exec your
> application.

This is, IMO, a rather bad approach. If your app takes longer than two
seconds to quit, it will fail. It's generally a bad idea to use exec()
on GUI apps. And you end up creating three subprocesses for no
particularly good reason. I much prefer an approach like this (also
typed on the spot, fill in the blanks yourself):

int main(int argc, char **argv)
{
    char dummy;
    read(STDIN_FILENO, &dummy, 1);
    LSOpen...(argv[1]);
}

When you launch this, create a pipe and connect it to the subtask's
standard input. The read() will block on that pipe. When your
application exits, the read will unblock due to the pipe being closed.
Then the LSOpen call will relaunch your program. You can use
NSWorkspace instead of LaunchServices if you prefer Cocoa, just
compile as Objective-C and don't forget the autorelease pool.

Mike
_______________________________________________

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