在信号处理函数中调用非可重入函数getpwnam

来源:互联网 发布:勇敢一点 薛之谦 知乎 编辑:程序博客网 时间:2024/05/19 02:03

因为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);                }        }}


0 0
原创粉丝点击