如果我有这样的东西。

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

void signalquit(int sig)
{
   printf("\nQuitting..\n");
   (void)signal(SIGINT, SIG_DFL);
   //How to return?
}

int main(void)
{
   (void)signal(SIGINT, signalquit);
   while (1)
   {
      //Something...
   }
   //Continue here after quit with "Control + C"
   return 0;
}

如何在while循环之后和退出Control+C之后返回到主函数谢谢你的回答!

最佳答案

如何通过信号留下无休止的循环?
标记你的任务完成。

#include <stdlib.h> /* for EXIT_XXX macros */
#include <signal.h>

volatile sig_atomic_t flag = 0;

void signalquit(int sig)
{
  flag = 1;

  signal(sig, SIG_DFL);

  return; /* Optional for void-functions */
}

int main(void)
{
  signal(SIGINT, signalquit);

  while (!flag)
  {
    //Something...
  }

  return EXIT_SUCCESS;
}

请注意,并非每个函数都可以从信号处理程序调用。printf()例如,异步信号不保证安全。
查找POSIX保证异步信号安全的函数列表。
您的代码使用signal()函数,由于历史原因,该函数非常不可移植。
便携式方法将使用scroll down here例如:
#include <stdlib.h> /* for EXIT_XXX macros */
#include <stdio.h> /* for perror() */
#include <signal.h>

volatile sig_atomic_t flag = 0;

int set_sig_handler(int sig, void(*handler)(int))
{
  struct sigaction sa = {0};
  sa.sa_handler = handler;
  return sigaction(sig, sa, NULL);
}

void signalquit(int sig)
{
  flag = 1;

  if (-1 == set_sig_handler(sig, SIG_DFL))
  {
    flag = 2;
  }
}

int main(void)
{
  if (-1 == set_sig_handler(SIGINT, signalquit))
  {
    perror("set_sig_handler() failed");
    return EXIT_FAILURE;
  }

  while (!flag)
  {
    //Something...
  }

  if (2 == flag)
  {
    perror("set_sig_handler() in signal handler failed");
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}

function sigaction()byAs pointed out一种更简单的方法是仅通过指定SA_RESETHAND标志显式安装处理程序以供单独使用。
#include <stdlib.h> /* for EXIT_XXX macros */
#include <stdio.h> /* for perror() */
#include <signal.h>

volatile sig_atomic_t flag = 0;

void signalquit(int sig)
{
  flag = 1;
}

int main(void)
{
  {
    struct sigaction sa = {0};

    sa.sa_handler = signalquit;
    sa.sa_flags = SA_RESETHAND;

    if (-1 == sigaction(SIGINT, sa, NULL))
    {
      perror("sigaction() failed");
      return EXIT_FAILURE;
    }
  }

  while (!flag)
  {
    //Something...
  }

  return EXIT_SUCCESS;
}

关于c - 如何通过信号留下无限循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48116259/

10-11 23:13
查看更多