确定是什么秘密握手导致他们只打印给定的行一次
determine what secret handshake causes them to print the given lines ONE TIME ONLY
所以我需要找到导致这个程序打印出来的原因"I'm unlocked!"但是当我运行这个算法时,它什么也没有打印出来。
我尝试删除代码行或添加睡眠,但无论我做什么,打印出来的都是空白。
我应该打印 "I'm unlocked!"
#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()
函数挂起调用线程,并且 returns 当调用具有已注册处理程序的信号时。
当 pause()
returns 和 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 脚本发出信号。
所以我需要找到导致这个程序打印出来的原因"I'm unlocked!"但是当我运行这个算法时,它什么也没有打印出来。
我尝试删除代码行或添加睡眠,但无论我做什么,打印出来的都是空白。
我应该打印 "I'm unlocked!"
#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()
函数挂起调用线程,并且 returns 当调用具有已注册处理程序的信号时。
当 pause()
returns 和 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 脚本发出信号。