为什么glibc futex挂断了

时间:2014-04-16 07:34:25

标签: c linux glibc futex

我使用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);
}

0 个答案:

没有答案