2

我已经使用 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#

这是源代码引发的错误,请帮助我,非常感谢。我的程序只有一个线程。

#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);
}
4

0 回答 0