【问题标题】:ctime_r failed in dockerctime_r 在 docker 中失败
【发布时间】:2019-02-06 01:24:24
【问题描述】:

我在 docker 中有一个应用程序,它是多线程的。我的转移时间代码如下。

FILE *fp = NULL;
char buf[256] = {0};
char filename[64] = {0};
long timestamp;
char status[16] = {0};
char tbuf[26] = {0};


fp = popen(cmd, "r");
if (fp) {
    while (fscanf(fp, "%s %d %s", filename, &timestamp, status) != EOF) {
        char *ts = ctime_r(&timestamp, tbuf);
        if (ts) {
            ts[strlen(ts)-1] = '\0';
            sprintf(buf, "%-32s%-32s%-8s", filename, ts, status);
        } else {
            sprintf(buf, "%-32s%-32s%-8s", filename, "Miss", status);
        }
    }
    pclose(fp);
}

但是tbuf的内容是“Sat Oct 29 21:37:05 44614”,ts为NULL。

我认为时间戳是一个有效值。但是为什么失败了呢?

【问题讨论】:

  • ctime_r() 是否期望 long * 或其他?见ref。如果没有完全启用编译器警告,那么您就是在浪费宝贵的时间。
  • “如果没有完全启用编译器警告,你就是在浪费宝贵的时间。”阿门。
  • 发布 minimal reproducible example 包括包含文件、main()、如何从文件中读取 1535686785、文件内容以及如何确定“Sat Oct 29 21:37:05 44614”(打印)。这有助于快速找到解决方案。
  • @chux 不是ctime_r的错误,而是fscanf的错误。我使用 %d 来读取时间戳,所以只填充了时间戳的低位。我刚刚将时间戳设置为 0,现在一切正常。

标签: c ctime


【解决方案1】:

为什么失败了?

OP后来加了代码,报了"error of ... fscanf"

警告启用良好,我的编译器也发出警告。

警告:格式“%d”需要“int *”类型的参数,但参数 4 的类型为“long int *”


从文本文件中读取time_t 很棘手。范围、纪元、数据类型属性都在起作用。此外,作为文件中的文本化数据,属性可能与编写它的系统不同。请注意,time_t 没有 fscanf() 说明符。

现在,让我们假设文本时间戳只是数字并且对应于整数time_t,即使我们不知道整数类型的细节。更高级的技术不需要这些假设。

使用可用的最广泛的签名类型读取时间戳,例如 intmax_t(或 C99 之前的系统上的 long)。一些范围检查是值得的。我还建议使用相同的宽类型编写time_t

注意:最好将fscanf() 返回值与一个预期值 (3) 进行比较,而不是仅与各种意外值之一(EOF、0、1、2)进行比较。对字符串输入使用宽度限制。

char filename[64] = {0};
char status[16] = {0};
// long timestamp;

// while (fscanf(fp, "%s %d %s", filename, &timestamp, status) != EOF) {
intmax_t timestamp_big;   
while (fscanf(fp, "%63s %jd %15s", filename, &timestamp_big, status) == 3) {
  time_t timestamp = (time_t) timestamp_big;
  if (timestamp != timestamp_big) Handle_OutOfRangeError();
  ...

long timestamp 倾向于Y2038 bug

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2020-05-08
    • 2017-06-21
    • 2019-04-25
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多