1 /* $OpenBSD: read.c,v 1.1 2011/09/13 23:50:17 fgsch Exp $ */
2 /*
3 * Federico G. Schwindt <fgsch@openbsd.org>, 2011. Public Domain.
4 */
5 #include <sys/types.h>
6 #include <pthread.h>
7 #include <signal.h>
8 #include <unistd.h>
9 #include "test.h"
10
11 volatile sig_atomic_t hits = 0;
12
13 void
handler(int sig)14 handler(int sig)
15 {
16 hits++;
17 }
18
19 void *
thr_read(void * arg)20 thr_read(void *arg)
21 {
22 int fds[2];
23 char buf;
24
25 CHECKe(pipe(fds));
26 ASSERT(read(fds[0], &buf, 1) == -1);
27 return ((caddr_t)NULL + errno);
28 }
29
30 int
main(int argc,char ** argv)31 main(int argc, char **argv)
32 {
33 struct sigaction sa;
34 pthread_t tid;
35 void *retval;
36
37 bzero(&sa, sizeof(sa));
38 sa.sa_handler = handler;
39 sa.sa_flags = SA_RESTART;
40 CHECKe(sigaction(SIGUSR1, &sa, NULL));
41 sa.sa_flags = 0;
42 CHECKe(sigaction(SIGUSR2, &sa, NULL));
43
44 CHECKr(pthread_create(&tid, NULL, thr_read, NULL));
45 sleep(2);
46
47 /* Should restart it. */
48 CHECKr(pthread_kill(tid, SIGUSR1));
49 sleep(1);
50
51 /* Should interrupt it. */
52 CHECKr(pthread_kill(tid, SIGUSR2));
53 sleep(1);
54
55 CHECKr(pthread_join(tid, &retval));
56 ASSERT(retval == (void *)EINTR);
57 ASSERT(hits == 2);
58 SUCCEED;
59 }
60