- 论坛徽章:
- 0
|
2楼正解,看看Richard Stevens的APUE学习下吧, 10.6. Reentrant Functions的例子里,在信号处理函数里面getpwnam调用了malloc,结果运行一段时间就会segmentation fault了,^_^.
Figure 10.5. Call a nonreentrant function from a signal handler
#include "apue.h"
#include <pwd.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("sar")) == NULL)
err_sys("getpwnam error");
if (strcmp(ptr->pw_name, "sar") != 0)
printf("return value corrupted!, pw_name = %s\n",
ptr->pw_name);
}
} |
|