【发布时间】:2009-11-01 06:50:28
【问题描述】:
10.6节的示例代码,预期结果为:
经过几次迭代后,getpwnam 使用的静态结构将被破坏,程序将以 SIGSEGV 信号终止。
但是在我的平台,Fedora 11,gcc (GCC) 4.4.0,结果是
[浪子@Freedom apue]$ ./corrupt
在 sig_alarm 中
我只能看到来自sig_alarm 的输出一次,并且该程序似乎由于某种原因挂起,但它确实存在,并且仍在运行。
但是当我尝试使用 gdb 运行程序时,似乎还可以,我会定期看到来自sig_alarm 的输出。
在我的手册中,它说信号处理程序将在信号处理后设置为 SIG_DEF,系统不会阻塞信号。所以在我的信号处理程序开始时,我重置了信号处理程序。
也许我应该改用sigaction,但我只想知道正常运行和gdb运行之间差异的原因。
我们将不胜感激任何建议和帮助。
以下是我的代码:
#include "apue.h"
#include <pwd.h>
void sig_alarm(int signo);
int main()
{
struct passwd *pwdptr;
signal(SIGALRM, sig_alarm);
alarm(1);
for(;;) {
if ((pwdptr = getpwnam("Zhijin")) == NULL)
err_sys("getpwnam error");
if (strcmp("Zhijin", pwdptr->pw_name) != 0) {
printf("data corrupted, pw_name: %s\n", pwdptr->pw_name);
}
}
}
void sig_alarm(int signo)
{
signal(SIGALRM, sig_alarm);
struct passwd *rootptr;
printf("in sig_alarm\n");
if ((rootptr = getpwnam("root")) == NULL)
err_sys("getpwnam error");
alarm(1);
}
【问题讨论】: