2011-08-14 22 views
9

Recibo un error relacionado con err_sys() en este código:¿Dónde se define la función err_sys()?

#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
int main() 
{ 
    int sockfd; 

    if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) 
     err_sys("can't create socket"); 

    close(sockfd); 
    return 0; 
} 

estoy consiguiendo el error de vinculador:

/tmp/cciuUVhz.o: In function `main': 
getsockopt.c:(.text+0x38): undefined reference to `err_sys' 
collect2: ld returned 1 exit status 

¿Dónde está la función err_sys() definido?

+0

¿Qué es 'err_sys'? –

+3

Nunca he oído hablar de 'err_sys' (así que no tengo idea de cómo' getsockopt.cpp' compila). Use 'perror' o' strerror' en su lugar. Además, realmente necesita comenzar a aceptar algunas respuestas anteriores, por favor. ¡No es dificil! –

+0

@Tomalak: Probablemente compila porque las advertencias no se muestran lo suficientemente altas, y el estándar C le permite no tener prototipos declarados para las funciones. –

Respuesta

18

Coloque esto en la parte superior de su código:

void err_sys(const char* x) 
{ 
    perror(x); 
    exit(1); 
} 

perror se define en stdio.h

err_sys se utiliza en el libro "Programación Red UNIX: Las tomas de red API" de Richard Stevens. No es algo común, hasta donde yo sé.

edición: fija error de código

+2

¿Por qué no utilizar una función para esto, en lugar de una macro? –

+0

Sin razón específica, ambos funcionarían. – Patrik

+5

La macro tal como está escrita tiene errores graves, p. 'if (foo) err_sys (x); else ... 'falla. Si no puede escribir una macro correcta, ¡use funciones! –

0

Debe especificar el archivo lib que contiene la implementación de esta función. Ese es un problema común al compilar el código c.

+3

Es especialmente común cuando usa una función que no tiene una implementación, porque no existe. –

5

¿Es esto desde TCP/IP Illustrated? Recuerdo haber visto esto y la definición se proporciona en el apéndice:

#include <errno.h> 
#include <stdarg.h> 
/* 
* Print a message and return to caller. 
* Caller specifies "errnoflag". 
*/ 
static void 
err_doit(int errnoflag, int error, const char *fmt, va_list ap) 
{ 
    char buf[MAXLINE]; 
    vsnprintf(buf, MAXLINE, fmt, ap); 
    if (errnoflag) 
     snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s", 
    strerror(error)); 
    strcat(buf, "\n"); 
    fflush(stdout);  /* in case stdout and stderr are the same */ 
    fputs(buf, stderr); 
    fflush(NULL);  /* flushes all stdio output streams */ 
} 


/* 
* Fatal error related to a system call. 
* Print a message and terminate. 
*/ 
void 
err_sys(const char *fmt, ...) 
{ 
    va_list  ap; 
    va_start(ap, fmt); 
    err_doit(1, errno, fmt, ap); 
    va_end(ap); 
    exit(1); 
} 
1

err_sys() es una función que se utiliza en varios libros escritos por W. Richard Stevens. Esta función se usa para imprimir qué tipo de error ocurrió.

La función se utiliza en programas en los textos con un archivo de encabezado personalizado "ourhdr.h" (o algo más). Consulte el apéndice para ver el encabezado o la definición de la función.

1

La fuente para esta función (de la Programación avanzada en el entorno UNIX®, por W. Richard Stevens) se puede encontrar en el sitio web del libro: http://www.apuebook.com/.

0

Descargar la carpeta de código fuente del libro que lo encontrará en: http://www.unpbook.com/src.html

Abrir la carpeta de código fuente y seleccione la carpeta lib. Luego abra el archivo llamado error.c. Encontrará el sys_err() definido en él.

0

Como han dicho otros, este código parece ejemplos de Stevens: Programación de red Unix. Si tiene el libro, mire en el apéndice D: código fuente misceláneo para la definición del libro de texto (así como el encabezado unp.h que se usa de manera general en los ejemplos). El archivo es demasiado para escribir en una respuesta de SO, pero una búsqueda rápida en Internet de "funciones de error estándar" de Stevens devuelve una gran cantidad de resultados de libros de Google con implementaciones.

Cuestiones relacionadas