1
2 #include <sys/types.h>
3 #include <sys/wait.h>
4 #include <sys/mman.h>
5 #include <semaphore.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <err.h>
9 #include <errno.h>
10 #include <fcntl.h>
11 #include <unistd.h>
12
13 #define SEM_NAME "/semtst"
14
15 int test_unnamed(void);
16 int test_named(void);
17 int test_named2(void);
18
19 int
test_unnamed(void)20 test_unnamed(void)
21 {
22 sem_t *s;
23 pid_t pid;
24 int status;
25
26 printf("testing unnamed process-shared semaphore\n");
27 s = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED,
28 -1, 0);
29 if (s == MAP_FAILED)
30 err(1, "mmap failed");
31 if (sem_init(s, 1, 0))
32 err(2, "sem_init failed");
33 if ((pid = fork()) == 0) {
34 printf("child: sem_wait()\n");
35 if (sem_wait(s))
36 err(3, "sem_wait failed");
37 printf("child: sem_wait() returned\n");
38 exit(0);
39 } else {
40 sleep(1);
41 printf("parent: sem_post()\n");
42 if (sem_post(s))
43 err(4, "sem_post failed");
44 waitpid(pid, &status, 0);
45 if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
46 printf("OK.\n");
47 else
48 printf("Failure.");
49 }
50 return (0);
51 }
52
53 int
test_named(void)54 test_named(void)
55 {
56 sem_t *s, *s2;
57 pid_t pid;
58 int status;
59
60 printf("testing named process-shared semaphore\n");
61 sem_unlink(SEM_NAME);
62 s = sem_open(SEM_NAME, O_CREAT, 0777, 0);
63 if (s == SEM_FAILED)
64 err(1, "sem_open failed");
65 s2 = sem_open(SEM_NAME, O_CREAT, 0777, 0);
66 if (s2 == SEM_FAILED)
67 err(2, "second sem_open call failed");
68 if (s != s2)
69 errx(3,
70 "two sem_open calls for same semaphore do not return same address");
71 if (sem_close(s2))
72 err(4, "sem_close failed");
73 if ((pid = fork()) == 0) {
74 printf("child: sem_wait()\n");
75 if (sem_wait(s))
76 err(5, "sem_wait failed");
77 printf("child: sem_wait() returned\n");
78 exit(0);
79 } else {
80 sleep(1);
81 printf("parent: sem_post()\n");
82 if (sem_post(s))
83 err(6, "sem_post failed");
84 waitpid(pid, &status, 0);
85 if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
86 printf("OK.\n");
87 else
88 printf("Failure.");
89 }
90
91 if (sem_close(s))
92 err(7, "sem_close failed");
93
94 return (0);
95 }
96
97 int
test_named2(void)98 test_named2(void)
99 {
100 sem_t *s, *s2, *s3;
101
102 printf("testing named process-shared semaphore, O_EXCL cases\n");
103 sem_unlink(SEM_NAME);
104 s = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0777, 0);
105 if (s == SEM_FAILED)
106 err(1, "sem_open failed");
107 s2 = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0777, 0);
108 if (s2 != SEM_FAILED)
109 errx(2, "second sem_open call wrongly succeeded");
110 if (errno != EEXIST)
111 err(3, "second sem_open call failed with wrong errno");
112
113 s3 = sem_open(SEM_NAME, 0);
114 if (s3 == SEM_FAILED)
115 err(4, "third sem_open call failed");
116 if (s != s3)
117 errx(5,
118 "two sem_open calls for same semaphore do not return same address");
119 if (sem_close(s3))
120 err(6, "sem_close failed");
121
122 if (sem_close(s))
123 err(7, "sem_close failed");
124
125 printf("OK.\n");
126 return (0);
127 }
128
129 int
main(void)130 main(void)
131 {
132 test_unnamed();
133 test_named();
134 test_named2();
135 return (0);
136 }
137