File: forky.c

package info (click to toggle)
libuev 2.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,944 kB
  • sloc: sh: 4,665; ansic: 1,428; makefile: 102
file content (89 lines) | stat: -rw-r--r-- 1,886 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* Example with fork and signals, in this case Ctrl-C, from terminal
 * 
 * A common problem for users of libuEV is how to combine it with the
 * traditional aspects of UNIX.  Since libuEV is just a wrapper for
 * signalfd() and epoll(), in this case, it can be worth a dedicated
 * example.  After all, command line use with Ctrl-C is one of the most
 * common use-cases.
 */

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

#include "src/uev.h"


void timeout(uev_t *w, void *arg, int events)
{
	char *id = (char *)arg;

	if (UEV_ERROR == events)
		puts("Ignoring timer watcher error ...");

	printf("I am the %s robot\n", id);
}

void teaser(uev_t *w, void *arg, int events)
{
	(void)arg;

	if (UEV_ERROR == events)
		puts("Ignoring SIGINT watcher error ...");

	puts("\nWe are here to protect you ...");
	puts("Sorry, you actually need to press Ctrl-\\ to exit.");
}

void cleanup(uev_t *w, void *arg, int events)
{
	(void)arg;

	if (UEV_ERROR == events)
		puts("Ignoring signal watcher error ...");

	/* Graceful exit, with optional cleanup ... */
	puts("\nAgainst the terrible secret of space.");

	uev_exit(w->ctx);
}

int main(int argc, char **argv)
{
	uev_ctx_t ctx;
	uev_t timerw;
	uev_t sig1w;
	uev_t sig2w;
	char *robot;
	pid_t pid;

	pid = fork();
	if (pid == -1)
		return 1;
	if (pid > 0)
		robot = "Shover";
	else
		robot = "Pusher";

	setsid();			/* puts child in new process group */
	uev_init(&ctx);

	/* example worker, a timer callback */
	uev_timer_init(&ctx, &timerw, timeout, robot, 100, 2000);

	/* the owls are not what they seem ... */
	uev_signal_init(&ctx, &sig1w, teaser,  NULL, SIGINT);
	uev_signal_init(&ctx, &sig2w, cleanup, NULL, SIGQUIT);

	puts("Starting, press Ctrl-C to exit.");

	return uev_run(&ctx, 0);
}

/**
 * Local Variables:
 *  compile-command: "make forky; ./forky"
 *  c-file-style: "linux"
 * End:
 */