определить, какое тайное рукопожатие заставляет их печатать данные строки ТОЛЬКО ОДИН РАЗ - PullRequest
0 голосов
/ 09 июля 2019

Так что мне нужно выяснить, что заставляет эту программу печатать "Я разблокирован!" Но когда я запускаю этот алгоритм, он ничего не печатает.

Я пытался удалить строки кода или добавить сон, но независимо от того, что я делаю, он просто печатает пустым.

Ожидается, что я напечатаю «Я разблокирован!»

#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 handlers\n", 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;
  }
}

1 Ответ

1 голос
/ 09 июля 2019

Функция 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.

...