xref: /DragonOS/user/apps/test_eventfd/main.c (revision 86ee1395de7c614865236ee15071c3603b794e44)
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 }