#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

static char *stack_base_ptr;
static char *stack_top_ptr;

static volatile sig_atomic_t sig_occurred = 0;

static void
sigusr1_handler(int signal_arg)
{
	sig_occurred = 1;
}

static void
consume_stack(long stackdepth)
{
	char		stack_cur;

	if ((stack_base_ptr - &stack_cur) < stackdepth)
		consume_stack(stackdepth);
	else
	{
		stack_top_ptr = &stack_cur;
		while (!sig_occurred)
			;
	}
}

int
main(int argc, char **argv)
{
	long		stackdepth = atol(argv[1]);
	char		stack_base;
	struct sigaction act;

	act.sa_handler = sigusr1_handler;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	if (sigaction(SIGUSR1, &act, NULL) < 0)
		perror("sigaction");

	stack_base_ptr = (char *) (((size_t) &stack_base + 65535) & ~65535UL);

	consume_stack(stackdepth);

	if (sig_occurred)
		printf("signal delivered, stack base %p top %p (%zu used)\n",
			   stack_base_ptr, stack_top_ptr, stack_base_ptr - stack_top_ptr);
	else
		printf("no signal delivered\n");

	return 0;
}