¿Cuándo debo usar perror(“…”) y fprintf(stderr, “…”)?

4 minutos de lectura

¿Cuando debo usar perror y fprintfstderr
freeboy1015

Leer las páginas de manual y algunos códigos realmente no me ayudaron a comprender la diferencia entre, o mejor, cuándo debería usar, perror("...") o fprintf(stderr, "...").

  • ¿Por qué querrías imprimir? ...: No such file or directory por ejemplo

    – usuario16217248

    1 de febrero a las 22:13

1646752689 825 ¿Cuando debo usar perror y fprintfstderr
jason

Vocación perror le dará el valor interpretado de errnoque es un valor de error local de subproceso escrito por llamadas al sistema POSIX (es decir, cada subproceso tiene su propio valor para errno). Por ejemplo, si hizo una llamada a open()y se generó un error (es decir, devolvió -1), entonces podrías llamar perror inmediatamente después para ver cuál era el error real. Tenga en cuenta que si llama a otras llamadas del sistema mientras tanto, entonces el valor en errno será escrito encima, y ​​llamando perror no será de ninguna utilidad para diagnosticar su problema si una llamada al sistema anterior generó un error.

fprintf(stderr, ...) por otro lado, se puede usar para imprimir sus propios mensajes de error personalizados. Al imprimir a stderrevita que la salida del informe de errores se mezcle con la salida “normal” que debería ir a stdout.

Manten eso en mente fprintf(stderr, "%s\n", strerror(errno)) es parecido a perror(NULL) desde una llamada a strerror(errno) generará el valor de cadena impreso para errnoy luego puede combinarlo con cualquier otro mensaje de error personalizado a través de fprintf.

  • oh, lo tengo. La función perror funciona de manera diferente dependiendo del valor de errno. If you use a function that effects errno then it makes sense to use perror.Si usa una función que no afecta a errno y simplemente devuelve un código de error, debe usar fprintf(stderr, fmt, …). Por ejemplo, strtol devolverá LONG_MAX o LONG_MIN si una cadena está fuera de rango y establecerá errno en ERANGE. Entonces, si strtol falla debido a que está fuera de rango, usaría perror.

    – freeboy1015

    24 de agosto de 2012 a las 2:22


  • un detalle, strerror no es necesario que sea seguro para subprocesos. Es estúpido, pero ese es el estándar. strerror_l se puede utilizar en su lugar como un reemplazo directo en los sistemas POSIX 2008. strerror_r también está disponible en sistemas más antiguos, pero tiene problemas realmente desagradables con algunos sistemas que tienen versiones no conformes.

    – R.. GitHub DEJA DE AYUDAR A ICE

    24 de agosto de 2012 a las 2:35

  • @R.. C11 tiene (tendrá 🙂 strerror_s como una variante segura para subprocesos.

    – Jens Gusted

    24 de agosto de 2012 a las 7:38

  • @R.., ja, ya lo tengo, y que yo sepa no me pagan nada. Y dado que MS parece estar eliminando su soporte para C por completo, al final seré el único 🙂 strerror_s en realidad no es tan malo como una interfaz.

    – Jens Gusted

    24 de agosto de 2012 a las 18:28


  • ¿Cortar el soporte por completo? Parece que volvieron a engañar al comité. Conseguir su _s basura en el estándar era básicamente un juego de MS (“Si adopta nuestras interfaces, consideraremos hacer que nuestros productos sean compatibles con su estándar”) y, por supuesto, ahora no lo están cumpliendo. En realidad, estoy de acuerdo en que esta interfaz no es mala en sí misma. Lo malo es la propaganda (en forma de advertencias del compilador) de que la mayor parte de la biblioteca estándar es “insegura” y que toda la familia de _s deben utilizarse funciones en lugar de las estándar.

    – R.. GitHub DEJA DE AYUDAR A ICE

    24 de agosto de 2012 a las 18:45

¿Cuando debo usar perror y fprintfstderr
freeboy1015

Hacen cosas bastante diferentes.

Tu usas perror() para imprimir un mensaje a stderr que corresponde a errno. Tu usas fprintf() imprimir cualquier cosa para stderro cualquier otra corriente. perror() es una función de impresión muy especializada:

perror(str);

es equivalente a

if (str)
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
    fprintf(stderr, "%s\n", strerror(errno));

  • Excepto por perror("")

    – usuario16217248

    1 de febrero a las 21:50

1646752690 316 ¿Cuando debo usar perror y fprintfstderr
adib saad

perror(const char *s): imprime la cadena que le das seguida de una cadena que describe el valor actual de errno.

stderr: es un flujo de salida que se usa para canalizar sus propios mensajes de error (predeterminado a la terminal).

Pertinente:

char *strerror(int errnum): déle un número de error y devolverá la cadena de error asociada.

perror() siempre escribe en stderr; strerr(), utilizado junto con fprintf(), puede escribir en cualquier salida, incluido stderr pero no exclusivamente.

fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")

Además, perror impone su propio formato de texto “texto: descripción del error”

La función Perror toma más tiempo para realizar la ejecución. La llamada va del espacio del usuario al espacio del kernel, mientras que las llamadas fprintf van a la API del kernel.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad