sleep()和time()无法在for循环内正常运行

时间:2018-07-28 01:50:40

标签: c time sleep time.h unistd.h

我正在尝试创建一个tm结构指针数组,每个结构的tm_sec值比上一个大2秒。

#include <stdio.h>
#include <time.h>
#include <unistd.h> /* sleep() */

int main(signed int argc, char **argv) {
    struct tm *collection[5];

    for(struct tm **p = collection; p < collection + 5; p += 1) {
        sleep(2);
        const time_t timeNow = time(NULL);
        *p = gmtime(&timeNow);
    }

    for(struct tm **p = collection; p < collection + 5; p += 1) {
        if(p != collection + 4) {
            puts((**p).tm_sec == (**(p + 1)).tm_sec ? "equal" : "not equal");
        }

        puts(asctime(*p));
    }
}

执行持续10秒钟左右,这看起来不错,但最终输出为:

equal
Sat Jul 28 01:42:15 2018
equal
Sat Jul 28 01:42:15 2018    
equal
Sat Jul 28 01:42:15 2018    
equal
Sat Jul 28 01:42:15 2018    
Sat Jul 28 01:42:15 2018

在linux64上与GCC 7.3.0一起编译。不知道我在做什么错。

注意:最初在插入第一个元素时我没有第一个for循环睡眠,但是为了简单起见,我在这里将其删除。没关系。

1 个答案:

答案 0 :(得分:2)

在手册页中:

  

POSIX.1-2001说:“ asctime(),ctime(),gmtime()和localtime()函数应在两个静态对象之一中返回值:分解时间结构和类型数组char。执行任何一个功能都可能会覆盖其他任何一个功能在这些对象中返回的信息。”这可以在glibc实现中发生。

对于单线程程序,只需取消引用指针即可:

#include <stdio.h>
#include <time.h>
#include <unistd.h> /* sleep() */

int main(signed int argc, char **argv) {
    struct tm collection[5];

    for (struct tm *p = collection; p < collection + 5; p++) {
        sleep(2);
        const time_t timeNow = time(NULL);
        *p = *gmtime(&timeNow);
    }

    for(struct tm *p = collection; p < collection + 5; p++) {
        if(p != collection + 4) {
            puts((*p).tm_sec == (*(p + 1)).tm_sec ? "equal" : "not equal");
        }

        puts(asctime(p));
    }
}

对于多线程程序,您需要使用gmtime_rasctime_r