Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Leaving an infinite while loop in C

Tags:

c

while-loop

I have a loop that constantly reads from my serial port. The loop is infinite, so the only way I know of stopping the program is by using Ctrl+C. The problem with this solution, which I suspect is causing other problems as well, is that when I use Ctrl+C, my program ends abruptly. At the end of the program, I close the connection to the file descriptor of the serial port I am accessing, but I don't think my program ever reaches that because of me using the Ctrl+C command, which just stops the program exactly where it is.

Is there a way for me to create the infinite while loop, and exit when I want, but at the same time, maintain the capability to execute the code beneath it?

like image 857
capcom Avatar asked Dec 01 '22 22:12

capcom


2 Answers

You could do something like this:

sig_atomic_t volatile g_running = TRUE;

void sig_handler(int signum)
{
  if (signum == SIGINT)
    g_running = FALSE;
}

int main()
{
  signal(SIGINT, &sig_handler);
  while (g_running)
  {
    //your code
  }
  //cleanup code
}

This will catch the SIGINT signal generated by pressing CTRL-C and break the loop by setting g_running to FALSE. Your cleanup code is then executed

like image 28
Zoneur Avatar answered Dec 05 '22 00:12

Zoneur


Try this and see what happens:

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

volatile sig_atomic_t stop;

void
inthand(int signum)
{
    stop = 1;
}

int
main(int argc, char **argv)
{
    signal(SIGINT, inthand);

    while (!stop)
        pause();
    printf("exiting safely\n");

    return 0;
}

Ctrl-C sends a signal (SIGINT) to your process. The default action for the process is to exit when it gets it, but you can catch the signal instead and handle it gracefully.

like image 194
Art Avatar answered Dec 05 '22 02:12

Art