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, "...")
.
¿Cuándo debo usar perror(“…”) y fprintf(stderr, “…”)?
freeboy1015
jason
Vocación perror
le dará el valor interpretado de errno
que 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 stderr
evita 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 errno
y 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
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 stderr
o 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
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.
¿Por qué querrías imprimir?
...: No such file or directory
por ejemplo– usuario16217248
1 de febrero a las 22:13