所以我需要找到是什么原因导致这个程序打印出“我已解锁!”但是当我运行这个算法时,它什么也没打印出来。
我尝试删除代码行或添加 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/