我使用APUE中引用的err_doit函数编写程序。该程序将在无限循环中使用此功能打印消息量。但是几分钟后运行它总是挂起。我使用strace命令附加此过程来调试它,下面的消息是打印。
......
gettimeofday({1397628460, 158883}, NULL) = 0
write(1, "\1\0\0\0", 4) = 4
futex(0xb76b0a6c, FUTEX_WAIT_PRIVATE, 2, NULL^C <unfinished ...>
root@slave:~/ci/cmake#
这里有源代码提出bug,请帮帮我,非常感谢。我的程序只有一个帖子。
#define MAXLINE 4096
/*
* Print a message and return to caller.
* Caller specifies "errnoflag".
*/
static void err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE] = {0};
struct timeval cur_time;
struct tm* loc_time = NULL;
int32_t len = 0;
int32_t i = 0;
gettimeofday(&cur_time,NULL);
/*it looks like hangs up at here from strace message*/
i = 1;
write(1,&i,4);
loc_time = localtime(&cur_time.tv_sec);
i = 2;
write(1,&i,4);
len += strftime(buf,MAXLINE,"[%F %T",loc_time);
len += snprintf(buf + len,MAXLINE - len,".%d]",(int)cur_time.tv_usec);
len += vsnprintf(buf + len, MAXLINE - len, fmt, ap);
if (errnoflag)
{
snprintf(buf + len, MAXLINE - len, ": %s", strerror(error));
}
i = 3;
write(1,&i,4);
strcat(buf, "\n");
write(1,buf,strlen(buf));
i = 4;
write(1,&i,4);
return;
}
void CILog_Msg(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(0, 0, fmt, ap);
va_end(ap);
}
void CILog_Errno(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
}