|
《unix环境高级编程》上的
1
#include
<
string
.h
>
2
#include
<
errno.h
>
3
#include
<
pthread.h
>
4
#include
<
stdlib.h
>
5
6
extern
char
**
environ;
7
8
pthread_mutex_t env_mutex;
9
static
pthread_once_t init_donw
=
PTHREAD_ONCE_INIT;
10
11
static
void
thread_init(
void
)
12
{
13
pthread_mutexattr_t attr;
14
pthread_mutexattr_init(
&
attr);
15
pthread_mutexattr_settype(
&
attr,PTHREAD_MUTEX_RECURSIVE);
//
设置可递归的互斥量
16
pthread_mutex_init(
&
env_mutex,
&
attr);
17
pthread_mutexattr_destroy(
&
attr);
18
}
19
20
int
getevn_r(
const
char
*
name,
char
*
buf,
int
buflen)
21
{
22
int
i, len, olen;
23
24
pthread_once(
&
init_done,thread_init);
//
确保每个进程只调用一次threaad_init()
25
len
=
strlen(name);
26
pthread_mutex_lock(
&
env_mutex);
27
for
(i
=
0
;environ[i]
!=
NULL;i
++
)
28
{
29
if
( (strncmp(name,environ[i],len)
==
0
&&
(environ[i][len]
==
"
=
"
) )
30
{
31
olen
=
strlen(
&
environ[i][len
+
1
]);
32
if
( olen
>
buflen )
//
检查缓冲区长度是否足够
33
{
34
pthread_mutex_unlock(
&
env_mutex);
35
return
(ENOSPC);
36
}
37
strcpy(buf,
&
environ[i][len
+
1
]);
38
pthread_mutex_unlock(
&
env_mutex);
39
return
(
0
);
40
}
41
}
42
pthread_mutex_unlock(
&
env_mutex);
43
return
(ENOENT);
44
}
45
|