¿Cuándo debo usar perror ("per") y fprintf(stderr,"?")?


Leer las páginas de manual y algún código realmente no me ayudó en entendiendo la diferencia entre - o mejor, cuando debo usar - perror("...") o fprintf(stderr, "...").

 83
Author: Jamal, 2012-08-24

5 answers

Llamando a perror le dará el valor interpretado de errno, que es un valor de error local de subproceso escrito por syscalls 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), podría llamar a perror inmediatamente después para ver cuál era el error real. Tenga en cuenta que si llama a otras llamadas de sistema mientras tanto, entonces el valor en errno se escribirá y llamará a perror no será de ninguna utilidad en el diagnóstico de su problema si un error fue generado por un syscall anterior.

fprintf(stderr, ...) por otro lado, se puede usar para imprimir sus propios mensajes de error personalizados. Al imprimir en stderr, evita que la salida de informes de errores se mezcle con la salida "normal" que debería ir a stdout.

Tenga en cuenta que fprintf(stderr, "%s\n", strerror(errno)) es similar a perror(NULL) ya que una llamada a strerror(errno) generará el valor de cadena impreso para errno, y luego puede combinarlo con cualquier otro personalizado mensaje de error vía fprintf.

 91
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-22 20:11:29

Hacen cosas bastante diferentes.

Se usa perror() para imprimir un mensaje a stderr que corresponde a errno. Se usa fprintf() para imprimir cualquier cosa a stderr, o cualquier otro flujo. 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));
 34
Author: freeboy1015,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-24 06:53:09

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

stderr: es un flujo de salida utilizado para canalizar sus propios mensajes de error (por defecto a la terminal).

Pertinente:

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

 9
Author: Adib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-24 02:13:13

Perror () siempre escribe a stderr; strerr (), usado junto con fprintf (), puede escribir en cualquier salida - incluyendo 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 texto formateando "texto: descripción de error"

 0
Author: Sebastien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-19 14:28:07

La función Perror toma más tiempo para realizar la ejecución la llamada va del espacio de usuario al espacio kernal donde las llamadas fprintf van más a la api al kernal

 -2
Author: vivek singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-04 07:53:57