OSDN Git Service

125759babc9376fb8b5c00d7b6b0ed8909e4300e
[uclinux-h8/uClibc.git] / test / nptl / tst-sem4.c
1 /* Copyright (C) 2002 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <errno.h>
20 #include <fcntl.h>
21 #include <semaphore.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25
26
27 static void
28 remove_sem (int status, void *arg)
29 {
30   sem_unlink (arg);
31 }
32
33
34 int
35 main (void)
36 {
37   sem_t *s;
38   sem_t *s2;
39   pid_t pid;
40   int val;
41
42   s = sem_open ("/glibc-tst-sem4", O_CREAT, 0600, 1);
43   if (s == SEM_FAILED)
44     {
45       if (errno == ENOSYS)
46         {
47           puts ("sem_open not supported.  Oh well.");
48           return 0;
49         }
50
51       /* Maybe the shm filesystem has strict permissions.  */
52       if (errno == EACCES)
53         {
54           puts ("sem_open not allowed.  Oh well.");
55           return 0;
56         }
57
58       printf ("sem_open: %m\n");
59       return 1;
60     }
61
62   on_exit (remove_sem, (void *) "/glibc-tst-sem4");
63
64   /* We have the semaphore object.  Now try again with O_EXCL, this
65      should fail.  */
66   s2 = sem_open ("/glibc-tst-sem4", O_CREAT | O_EXCL, 0600, 1);
67   if (s2 != SEM_FAILED)
68     {
69       puts ("2nd sem_open didn't fail");
70       return 1;
71     }
72   if (errno != EEXIST)
73     {
74       puts ("2nd sem_open returned wrong error");
75       return 1;
76     }
77
78   /* Check the value.  */
79   if (sem_getvalue (s, &val) == -1)
80     {
81       puts ("getvalue failed");
82       return 1;
83     }
84   if (val != 1)
85     {
86       printf ("initial value wrong: got %d, expected 1\n", val);
87       return 1;
88     }
89
90   if (TEMP_FAILURE_RETRY (sem_wait (s)) == -1)
91     {
92       puts ("1st sem_wait failed");
93       return 1;
94     }
95
96   pid = fork ();
97   if (pid == -1)
98     {
99       printf ("fork failed: %m\n");
100       return 1;
101     }
102
103   if (pid == 0)
104     {
105       /* Child.  */
106
107       /* Check the value.  */
108       if (sem_getvalue (s, &val) == -1)
109         {
110           puts ("child: getvalue failed");
111           return 1;
112         }
113       if (val != 0)
114         {
115           printf ("child: value wrong: got %d, expect 0\n", val);
116           return 1;
117         }
118
119       if (sem_post (s) == -1)
120         {
121           puts ("child: post failed");
122           return 1;
123         }
124     }
125   else
126     {
127       if (TEMP_FAILURE_RETRY (sem_wait (s)) == -1)
128         {
129           puts ("2nd sem_wait failed");
130           return 1;
131         }
132
133       if (sem_getvalue (s, &val) == -1)
134         {
135           puts ("parent: 2nd getvalue failed");
136           return 1;
137         }
138       if (val != 0)
139         {
140           printf ("parent: value wrong: got %d, expected 0\n", val);
141           return 1;
142         }
143     }
144
145   return 0;
146 }