【问题标题】:How to program control+C signal in C language to pause and unpause the output?如何用C语言编写control+C信号来暂停和取消暂停输出?
【发布时间】:2016-08-06 18:51:39
【问题描述】:

我是 C 编程新手,对控制信号的了解也较少。下面是我的程序,我试图在其中 pauseunpause 我的输出在 while 循环内运行。到目前为止,我可以通过按 CTRL+CPause 输出,但我需要通过按 CTRL+C 再次unpause 输出,但我没有不知道该怎么做。我的问题是如何通过按 CTRL+C 键再次Unpause 我的输出。此外,我正在使用 Spinlock 暂停输出,直到再次按下 CTRL+C ,这将恢复程序以完成显示输出。该程序利用睡眠功能每秒输出到终端。任何建议将不胜感激。

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

void f(int); //handler

int main( int ac, char* av[] )
{

  if(ac == 1)
  {
    printf("No argument provided");
    exit(1);
  }
  int i = atoi(av[1]);
  printf("This is argument av: %i ", i);
  printf("\n");

  signal( SIGINT, f); // install the handler

  int k = 0;
  while(k != i)
  {
    printf("help \n");
    sleep(1);
    k++;
  }

  return 0;

}

void f(int signum)
{
  while(signum)
  {
    int lock =0;
    if(lock == 1)
      continue;
  }
}

【问题讨论】:

  • 我们不会为你做作业。
  • 您不希望信号处理程序中出现循环。将lock 设为全局变量,在信号处理程序中切换它,在main 代码中检查它。

标签: c signals


【解决方案1】:

某些 unice 在调用后将信号处理重置为默认值,您必须将其重置。

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

static int lock;

void f(int);

int main(int ac, char *av[])
{

  if (ac == 1) {
    printf("No argument provided");
    exit(1);
  }

  int i = atoi(av[1]);
  printf("This is argument av: %i \n", i);
  signal(SIGINT, f);
  int k = 0;
  while (k != i) {
    printf("help %d \n", k);
    while (lock == 1) {
      puts("Sleeping, waiting for signal");
      sleep(1);
    }
    sleep(1);
    k++;
  }
  return 0;
}

void f(int signum)
{
  signal(SIGINT, f);
  printf("Signal raised %d\n", signum);
  if (lock == 1) {
    lock = 0;
  } else {
    lock = 1;
  }
}

【讨论】:

  • 这很有意义,感谢您的帮助。我对信号处理和自旋锁特别陌生。我会确保在退出程序之前重置信号处理。
  • 如果您使用sigaction 而不是可悲地未指定的signal,您可以控制信号处理程序是否是一次性的。退出程序之前不必重置信号处理程序;无论如何,它们会在程序运行时消失。
  • @zwol sigaction 不适合初学者。如果他们继续前进,他们将很快找到signal 的限制并拉出他们的开罐器以释放标有“信号处理”的大锡的蠕虫。他们中的大多数人放弃了。这就是所谓的“适者生存”。是的,我个人资料中对自己的描述完全正确。
  • 我不同意;我认为应该只教sigaction,即使是对初学者进行排名。基本用法并不比signal 复杂多少,它使您摆脱了一堆可移植性陷阱,更复杂的用法都是从基本的增量更改,而不必从不同的原语重新开始。 (而且它在 Windows 上不存在,它教给我们宝贵的一课,即信号不能在 Windows 上使用。)
  • @zwol 我同意,但 signal 用于纯技术原因:signal(2)c89POSIX.1-2001sigaction(2)POSIX.1-2001SVr4。标记为csignalsposix 无关,问题是为什么signal(2) 在OP 的代码中不起作用。有时很难决定是否应该逐字回答问题,或者实际问题是否完全不同,直接回答问题会导致 OP 陷入死胡同跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2022-01-06
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多