2009-02-21 24 views

Respuesta

30

Las llamadas al sistema son funciones del sistema operativo, como en UNIX, la función malloc() se basa en la llamada al sistema sbrk() (para cambiar el tamaño del espacio de memoria del proceso).

Las bibliotecas son solo códigos de aplicaciones que no forman parte del sistema operativo y que a menudo estarán disponibles en más de un sistema operativo. Básicamente son lo mismo que llamadas de función dentro de su propio programa.

La línea puede ser un poco borrosa, pero simplemente vea las llamadas del sistema como funcionalidad a nivel del kernel.

12

Las llamadas al sistema son la interfaz entre el código de nivel de usuario y el kernel. C Las rutinas de la biblioteca son llamadas a la biblioteca como cualquier otra, simplemente son comúnmente provistas (más o menos universalmente). Muchas de las rutinas estándar de la biblioteca son envoltorios (delgados o no) de las llamadas al sistema, lo que tiende a difuminar un poco la línea.

En cuanto a cuál usar, como regla general, utilice el que mejor se adapte a sus necesidades.

6

Las llamadas descritas en la sección 2 del manual son todas envolturas relativamente delgadas acerca de las llamadas reales a los servicios del sistema que atrapan al kernel. Las rutinas de la biblioteca estándar C descritas en la sección 3 del manual son funciones de la biblioteca del lado del cliente que pueden o no usar llamadas al sistema.

This posting tiene una descripción de las llamadas al sistema y la captura al núcleo (en un contexto ligeramente diferente) y explica el mecanismo subyacente detrás de las llamadas al sistema con algunas referencias.

11

Las bibliotecas de funciones comunes se crean sobre la interfaz de llamada del sistema, pero las aplicaciones son gratuitas.

Las llamadas al sistema son como las claves de autenticación que tienen acceso para usar los recursos del kernel.

enter image description here

la imagen es de la programación avanzada de Linux y ayuda a entender cómo las aplicaciones de los usuarios interactúan con el núcleo.

+0

awesome pic. muy claro – henryyao

3

Como regla general, siempre debe usar la versión de la biblioteca C. A menudo tienen envoltorios que manejan cosas esotéricas como reinicios en una señal (si usted lo ha solicitado). Esto es especialmente cierto si ya se ha vinculado con la biblioteca. Todas las reglas tienen razones para romperse. Razones para utilizar las llamadas directas,

  1. Usted quiere ser libc agnóstico; Tal vez con un instalador. Dicho código podría ejecutarse en Android (bionic), uClibc y sistemas glibc/eglibc más tradicionales, independientemente de la biblioteca utilizada. Además, carga dinámica con envoltorios para crear una capa glibc/biónica en tiempo de ejecución que permite un doble binario Android/Linux.
  2. Necesita un rendimiento extremo. Aunque esto es probablemente raro y muy probablemente equivocado.Probablemente, repensar el problema proporcionará mejores beneficios de rendimiento y no llamando al sistema suele ser una ganancia de rendimiento, que el libc puede ocasionalmente hacer.
  3. Usted está escribiendo un código initramfs o init sin una biblioteca; para crear una imagen más pequeña o arrancar más rápido.
  4. Está probando una nueva kernel/plataforma y no quiere complicar la vida con un sistema de archivos completo; muy similar al initramfs.
  5. Desea hacer algo muy rápidamente al iniciar el programa, pero finalmente desea utilizar las rutinas libc.
  6. Para evitar un error conocido en el libc.
  7. La funcionalidad no está disponible a través del libc.

Lo sentimos, la mayoría de los ejemplos son específicos de Linux, pero los racionales deberían aplicarse a otras variantes de Unix. El último elemento es bastante común cuando se introducen nuevas características en un kernel. Por ejemplo, cuando se introdujo por primera vez kqueue o epoll, no hubo libc para admitirlos. Esto también puede suceder si el sistema tiene una biblioteca más antigua, pero un kernel más nuevo y desea usar esta funcionalidad.

Si su proceso no ha utilizado el libc, lo más probable es que tenga algo en el sistema. Al codificar sus propias variantes, puede negar la memoria caché al proporcionar dos rutas para el mismo objetivo final. Además, Unix compartirá las páginas de códigos entre los procesos. En general, no hay ninguna razón para no utilizar la versión libc.

Otras respuestas ya han hecho un trabajo estelar en la diferencia entre libc y llamadas al sistema.

Cuestiones relacionadas