_REENTRANT为我们做了三件事情,并且做得非常优雅: 1)对部分函数重新定义它们的可安全重入的版本,这些函数名字
一般不会发生改变,只是会在函数名后面添加_r字符串,如函数名
gethostbyname变成gethostbyname_r。 2)stdio.h中原来以宏的形式实现的一些函数将变成可安全重入函
数。 3)在error.h中定义的变量errno现在将成为一个函数调用,它能
够以一种安全的多线程方式来获取真正的errno的值。
了解了_REENTRANT我们在使用-D_REENTRANT调用时就会明白程序的安全性
涉及线程的问题
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int global = 5;
int main(void)
{
pid_t pid;
char *string = "these are values before fork:";
int local = 10;
printf("before fork * * *\n\n");
if((pid = fork())<0){
printf("fork error");
exit(-1);
}
if(pid == 0){
string = "I am child.";
printf("\nMy pid is %d,%s\n"
"pid = %d\n global = %d\n local = %d\n",
getpid(),string,pid,global,local);
global++;
}
else{
string = "I am parent.";
printf("\nMy pid is %d,%s\n"
"pid = %d\n global = %d\n local = %d\n",
getpid(),string,pid,global,local);
local++;
}
printf("%s\n Now,global = %d,local = %d\n",string,global,local);
exit(0);
}