Какой размер я должен допускать strerror_r?

В базе R,

D <- matrix(c(1, 0, 0,
              1, 0, 1,
              1, 0, 0,
              2, 0, 3,
              1, 1, 1),
            ncol=3, byrow=TRUE, dimnames=list(1:5, c("v1", "v2", "v3")))
D <- data.frame(user=c("a", "a", "b", "b", "c"), D)
aggregate(. ~ user, D, sum)

Возвращает

> aggregate(. ~ user, D, sum)
  user v1 v2 v3
1    a  2  0  1
2    b  3  0  3
3    c  1  1  1
31
задан mat_geek 8 January 2009 в 06:22
поделиться

2 ответа

Наличие достаточно большого статического предела, вероятно, достаточно хорошо для всех ситуаций. Если действительно необходимо получить все сообщение об ошибке, можно использовать версия GNU strerror_r, или можно использовать стандартную версию и опросить ее с последовательно более крупными буферами, пока Вы не получаете то, в чем Вы нуждаетесь. Например, можно использовать что-то как код ниже.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Call strerror_r and get the full error message. Allocate memory for the
 * entire string with malloc. Return string. Caller must free string.
 * If malloc fails, return NULL.
 */
char *all_strerror(int n)
{
    char *s;
    size_t size;

    size = 1024;
    s = malloc(size);
    if (s == NULL)
        return NULL;

    while (strerror_r(n, s, size) == -1 && errno == ERANGE) {
        size *= 2;
        s = realloc(s, size);
        if (s == NULL)
            return NULL;
    }

    return s;
}

int main(int argc, char **argv)
{
    for (int i = 1; i < argc; ++i) {
        int n = atoi(argv[i]);
        char *s = all_strerror(n);
        printf("[%d]: %s\n", n, s);
        free(s);
    }

    return 0;
}
11
ответ дан 11 October 2019 в 12:24
поделиться

Я не волновался бы об этом - размер буфера 256 намного больше, чем достаточный, и 1024 излишество. Вы могли использовать strerror() вместо strerror_r(), и затем дополнительно strdup() результат, если необходимо сохранить строку ошибки. Это не ориентировано на многопотоковое исполнение, все же. Если действительно необходимо использовать strerror_r() вместо strerror() для потокобезопасности, просто используйте размер 256. В glibc-2.7, самая длинная строка сообщения об ошибке является 50 символами ("Недопустимый или неполный многобайтовый или широкий символ"). Я не ожидал бы, что будущие сообщения об ошибках будут значительно более длинными (в худшем случае, несколько байтов дольше).

9
ответ дан Adam Rosenfield 11 October 2019 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: