因为main函数和信号处理函数中都调用getpwnam函数,而在getpwnam函数中会调用malloc和free,如果主函数malloc之后收到SIGALRM信号进入信号处理函数,在信号处理函数里malloc然后free,而在信号处理函数调用free和main函数也在调用free时,malloc和free维护的数据结构就出现了损坏。
所以在信号处理函数中调用非可重入函数,则其结果是不可预知的。
#include "apue.h"
#include <pwd.h>
#include "error.h"
static void my_alarm(int signo)
{
struct passwd *rootptr;
printf("in signal handler\n");
if ((rootptr = getpwnam("root")) == NULL)
{
err_sys("getpwnam(root) error");
}
alarm(1);
}
int main(void)
{
struct passwd *ptr;
signal(SIGALRM, my_alarm);
alarm(1);
for ( ; ; )
{
if ((ptr = getpwnam("sebastien")) == NULL)
{
err_sys("getpwnam error");
}
if (strcmp(ptr->pw_name, "sebastien") != 0)
{
printf("return value corrupted!, pw_name = %s\n", ptr->pw_name);
}
}
}