C-确定什么秘密握手会导致他们仅一次打印给定线



所以我需要找到导致此程序打印出"我已解锁的!"的原因。但是,当我运行此算法时,它就什么也没有打印出来。

我尝试删除代码线或添加睡眠,但是无论我做什么,都只会打印出空白。

我期望打印"我被解锁了!"

#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
volatile int locked, t, c;
static void handler(int signo);
int main(int argc, char * argv[])
{
  locked = 1;
  t = c = 0;
  char * knock = getenv("KNOCK");
  if(knock == NULL || strcmp(knock, "KNOCK"))
  {
    return 1;
  }
  if(signal(SIGUSR1, handler) == SIG_ERR ||
     signal(SIGUSR2, handler) == SIG_ERR ||
     signal(SIGALRM, handler) == SIG_ERR)
  {
    fprintf(stderr, "%s: cannot register signal handlersn", argv[0]);
    return 2;
  }
  while(locked)
  {
    pause();
  }
  puts("I'm unlocked!");
  return 0;
}
static void handler(int signo)
{
  switch(signo)
  {
    case SIGUSR1:
      if(c == 2)
      {
        t = alarm(3);
      }
      break;
    case SIGUSR2:
      c++;
      if(t == 1)
      {
        locked = 0;
      }
      break;
    case SIGALRM:
      t = 0;
      break;
  }
}

pause()函数暂停调用线程并返回,当带有注册处理程序的信号。

pause()返回 locked == 0

时,循环将终止

因此,以下信号序列和计时将解锁:

SIGUSR2  // c = 1
SIGUSR2  // c = 2
SIGUSR1  // t = 0 (no scheduled alarm)
Delay two seconds
SIGUSR1  // t = 1 (alarm seconds remaining)
SIGUSR2  // locked = 0 (because t == 1)

可以使用kill()函数从单独的线程或进程发出信号,也可以使用kill命令。

相关内容

  • 没有找到相关文章

最新更新