views:

275

answers:

4

Whats the smartest way to run an application continuously so that it doesn't exit after it hits the bottom? Instead it starts again from the top of main and only exits when commanded. (This is in C)

+2  A: 
while (true)
{
....
}

To elaborate a bit more, you want to put something in that loop that allows you to let the user do repeated actions. Whether it's reading key strokes and performing actions based on the keys pressed, or reading data from the socket and sending back a response.

Kibbee
+10  A: 

You should always have some way of exiting cleanly. I'd suggest moving the code off to another function that returns a flag to say whether to exit or not.

int main(int argc, char*argv[])
{

     // param parsing, init code

     while (DoStuff());

    // cleanup code
    return 0;
 }

 int DoStuff(void)
 {
     // code that you would have had in main

     if (we_should_exit)
         return 0;

     return 1;
 }
geofftnz
+4  A: 

Most applications that don't fall through enter some kind of event processing loop that allows for event-driven programming.

Under Win32 development, for instance, you'd write your WinMain function to continually handle new messages until it receives the WM_QUIT message telling the application to finish. This code typically takes the following form:

// ...meanwhile, somewhere inside WinMain()
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
     TranslateMessage(&msg);
     DispatchMessage(&msg);
}

If you are writing a game using SDL, you would loop on SDL events until deciding to exit, such as when you detect that the user has hit the Esc key. Some code to do that might resemble the following:

bool done = false;
while (!done)
{
    SDL_Event event;
    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT:
                done = true;
                break;
            case SDL_KEYDOWN:
                if (event.key.keysym.sym == SDLK_ESCAPE)
                {
                    done = true;
                }
                break;
        }
    }
}

You may also want to read about Unix Daemons and Windows Services.

Parappa
+1  A: 

There are a number of ways to "command" your application to exit (such as a global exit flag or return codes). Some have already touched on using an exit code so I'll put forward an easy modification to make to an existing program using an exit flag.

Let's assume your program executes a system call to output a directory listing (full directory or a single file):

int main (int argCount, char *argValue[]) {
    char *cmdLine;
    if (argCount < 2) {
        system ("ls");
    } else {
        cmdLine = malloc (strlen (argValue[1]) + 4);
        sprintf (cmdLine, "ls %s", argValue[1]);
        system (cmdLine);
    }
}

How do we go about making that loop until an exit condition. The following steps are taken:

  • Change main() to oldMain().
  • Add new exitFlag.
  • Add new main() to continuously call oldMain() until exit flagged.
  • Change oldMain() to signal exit at some point.

This gives the following code:

static int exitFlag = 0;

int main (int argCount, char *argValue[]) {
    int retVal = 0;

    while (!exitFlag) {
        retVal = oldMain (argCount, argValue);
    }

    return retVal;
}

static int oldMain (int argCount, char *argValue[]) {
    char *cmdLine;
    if (argCount < 2) {
        system ("ls");
    } else {
        cmdLine = malloc (strlen (argValue[1]) + 4);
        sprintf (cmdLine, "ls %s", argValue[1]);
        system (cmdLine);
    }

    if (someCondition)
        exitFlag = 1;
}
paxdiablo