1*86ee1395Slinfeng #include <err.h>
2*86ee1395Slinfeng #include <inttypes.h>
3*86ee1395Slinfeng #include <stdio.h>
4*86ee1395Slinfeng #include <stdlib.h>
5*86ee1395Slinfeng #include <sys/eventfd.h>
6*86ee1395Slinfeng #include <sys/types.h>
7*86ee1395Slinfeng #include <unistd.h>
8*86ee1395Slinfeng
9*86ee1395Slinfeng int
main(int argc,char * argv[])10*86ee1395Slinfeng main(int argc, char *argv[])
11*86ee1395Slinfeng {
12*86ee1395Slinfeng int efd;
13*86ee1395Slinfeng uint64_t u;
14*86ee1395Slinfeng ssize_t s;
15*86ee1395Slinfeng
16*86ee1395Slinfeng if (argc < 2) {
17*86ee1395Slinfeng fprintf(stderr, "Usage: %s <num>...\n", argv[0]);
18*86ee1395Slinfeng exit(EXIT_FAILURE);
19*86ee1395Slinfeng }
20*86ee1395Slinfeng
21*86ee1395Slinfeng efd = eventfd(0, 0);
22*86ee1395Slinfeng if (efd == -1)
23*86ee1395Slinfeng err(EXIT_FAILURE, "eventfd");
24*86ee1395Slinfeng
25*86ee1395Slinfeng switch (fork()) {
26*86ee1395Slinfeng case 0:
27*86ee1395Slinfeng for (size_t j = 1; j < argc; j++) {
28*86ee1395Slinfeng printf("Child writing %s to efd\n", argv[j]);
29*86ee1395Slinfeng u = strtoull(argv[j], NULL, 0);
30*86ee1395Slinfeng /* strtoull() allows various bases */
31*86ee1395Slinfeng s = write(efd, &u, sizeof(uint64_t));
32*86ee1395Slinfeng if (s != sizeof(uint64_t))
33*86ee1395Slinfeng err(EXIT_FAILURE, "write");
34*86ee1395Slinfeng }
35*86ee1395Slinfeng printf("Child completed write loop\n");
36*86ee1395Slinfeng
37*86ee1395Slinfeng exit(EXIT_SUCCESS);
38*86ee1395Slinfeng
39*86ee1395Slinfeng default:
40*86ee1395Slinfeng sleep(2);
41*86ee1395Slinfeng
42*86ee1395Slinfeng printf("Parent about to read\n");
43*86ee1395Slinfeng s = read(efd, &u, sizeof(uint64_t));
44*86ee1395Slinfeng if (s != sizeof(uint64_t))
45*86ee1395Slinfeng err(EXIT_FAILURE, "read");
46*86ee1395Slinfeng printf("Parent read %"PRIu64" (%#"PRIx64") from efd\n", u, u);
47*86ee1395Slinfeng exit(EXIT_SUCCESS);
48*86ee1395Slinfeng
49*86ee1395Slinfeng case -1:
50*86ee1395Slinfeng err(EXIT_FAILURE, "fork");
51*86ee1395Slinfeng }
52*86ee1395Slinfeng }