1. 信号安装后,只生效一次。要重复可接受信号,需要重新安装。
void sigroutine(int signo)
{
sig_alarm_flag = 1;
signal(SIGALRM, sigroutine);
}
2. 在信号处理程序中调用不可重入函数,其结果是不可预见的。
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
static void my_alarm(int signo)
{
struct passwd *rootptr;
printf("in signal handler\n");
if((rootptr = getpwnam("root")) == NULL)
{
printf("getpwnam() error for root\n");
return;
}
alarm(1);
}
int main(void)
{
struct passwd *ptr;
signal(SIGALRM, my_alarm);
alarm(1);
for(;;)
{
if ((ptr = getpwnam("user")) == NULL)
{
printf("getpwnam() error for user\n");
exit(0);
}
if (strcmp(ptr->pw_name, "user") != 0)
{
printf("return value corruptd!, pw_name = %s\n", ptr->pw_name);
}
else
{
printf("get correct, pw_name = %s\n", ptr->pw_name);
}
}
exit(0);
}