c - 确定什么 secret 握手导致他们只打印给定的行一次

标签 c linux unix signals sleep

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

我尝试删除代码行或添加 sleep ,但无论我做什么,它都只会打印出空白。

我应该打印“我已解锁!”

#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;
  }
}

最佳答案

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 命令从 shell 脚本发出。

关于c - 确定什么 secret 握手导致他们只打印给定的行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56942807/

相关文章:

c - C 标准库头文件的 Eclipse CDT 出现 "Unresolved inclusion"错误

c - 递归函数,传递参数 - 段错误

c - * 在函数参数 (C) 中

linux - 切换用户 "su"切换到bash

c - 该 C 程序在其他计算机上按预期运行,但在我的计算机上表现奇怪

c - semop : When decreasing a set of semaphores are all decremented at once or does it block on first failure?

linux - 如何将我的文件拆分成多个文件?

c++ - 将 float 作为指向矩阵的指针传递

c++ - 静态和动态pthread互斥锁初始化

python - 更改特定 python 安装的 python 路径