这里我们将 getenv 获取的环境变量写入全局变量中,所以这个版本不是可重入的。
下面是测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#define ARG_MAX 100
static char envbuf[ARG_MAX];
extern char **environ;
//用于输出环境变量
//void showenv()
//{
// int i = 0;
// while(environ[i]) {
// printf("%s\n", environ[i]);
// i++;
// }
//}
char *getenv(const char *name)
{
int i, len;
len = strlen(name);
for (i=0; environ[i]; i++) {
if ((strncmp(name, environ[i], len) == 0) && (environ[i][len] == '=')) {
strcpy(envbuf, &environ[i][len+1]);
return envbuf;
}
}
return 0;
}
void *thr_func(void *arg)
{
char *p = getenv(arg);
if (p) printf("thread 1: %s\n", p);
else printf("thread 1: not found\n");
}
int main()
{
int err, tid;
err = pthread_create(&tid, 0, thr_func, "SHELL");
if (err != 0) {
printf("can't create thread\n");
exit(1);
}
char *p = getenv("JOB");
if (p) printf("main part: %s\n", p);
else printf("main part: not found\n");
sleep(1);
return 0;
}