2012-05-23 24 views
6

Estoy escribiendo código que usa sched_setaffinity, que requiere kernel 2.5.8 o posterior. He estado tratando de averiguar si estas cosas son posibles:¿Cómo usar de forma segura las nuevas funciones de Linux?

  1. sistemas con los núcleos antiguos para compilar esta gracia, tal vez simplemente haciendo caso omiso de que el segmento de código completo.
  2. Si envío a alguien con un kernel anterior un binario compilado, pasará por encima de esta función o simplemente imprimirá una advertencia.

Supongo que mi pregunta es, ¿cómo se utilizan las nuevas funciones del núcleo de forma segura, sin romper toda la aplicación cuando se utiliza un sistema anterior?

+4

Deja de preocuparte por la serie 2.5 kernel y todo lo anterior. Cualquiera que todavía esté usando esos debe ser puesto en una institución mental o algo :) –

+1

@Nikolai: Varios dispositivos Linux incorporados todavía ejecutan 2.4.x. –

+1

Estoy seguro de que lo hacen. También construyen cuidadosamente un conjunto muy restringido de binarios de usuarios, de modo que el grupo objetivo no sea un problema aquí. –

Respuesta

2

¿Está intentando hacer que su programa se vincule o se ejecute? Puede invocar la llamada al sistema directamente a través de la función glibc syscall() sin necesidad de una biblioteca C reciente. Obviamente va a fallar en los sistemas anteriores sin soporte (una prueba rápida muestra que el kernel devuelve -1 == ENOSYS para los números de syscall no implementados), por lo que deberá probarlo.

3

Utilice dlopen() con NULL como el nombre de archivo y dlsym() la función que desea utilizar. Si el dlsym() tiene éxito, llame a la función a través del puntero de función que se devolvió.

+2

Incluso si el símbolo está en la libc, la llamada aún puede fallar con 'ENOSYS'. –

+0

innecesariamente complicado. Solo usa syscall(). –

+0

Ambos parecen buenas opciones. Por lo que puedo decir, el dlopen/dlsym() comprueba para ver que la función existe. Y syscall() es simplemente otra forma de llamar a las llamadas al sistema de Linux, a través de glibc. Sin embargo, ¿por qué tener syscall en absoluto? ¿Qué hace esto aparte de agregar otra capa de abstracción? Esta solución parece prometedora, solo quiero asegurarme de que no haga nada más que pueda ser no deseado. – wlformyd

Cuestiones relacionadas