Construir contra los encabezados de Linux más nuevos que libc se construye usando

Quiero escribir un progtwig usando la nueva política de progtwigción SCHED_DEADLINE disponible desde Linux 3.14 .

sched_setattr con un progtwig simple que intenta usar la función sched_setattr .

 #include  int main(void) { // struct sched_attr attr; // attr.size = sizeof(struct sched_attr); // attr.sched_policy = SCHED_DEADLINE; sched_setattr(0, (void*)0, 0); return 0; } 

Sin embargo al comstackr me sale el siguiente error:

 $gcc dead.c dead.c: In function 'main': dead.c:8:2: warning: implicit declaration of function 'sched_setattr' [-Wimplicit-function-declaration] sched_setattr(0, (void*)0, 0); ^~~~~~~~~~~~~ /tmp/ccGxWxZE.o: In function `main': dead.c:(.text+0x19): undefined reference to `sched_setattr' collect2: error: ld returned 1 exit status 

Mi sistema ejecuta Ubuntu 16.10 Yakkety, con el kernel 4.8.0-59-generic. El archivo sched.h incluido se encuentra en /usr/include/sched.h y lo proporciona el paquete libc6-dev . Este archivo de cabecera no contiene la función sched_setattr y amigos que estoy tratando de usar.

Sin embargo, el kernel (y los encabezados de kernel) que he instalado viene con un archivo de encabezado sched.h que contiene las definiciones que necesito. Se encuentra en /usr/src/linux-headers-4.8.0-58/include/linux/sched.h , en mi sistema.

Así que creo ingenuamente que vamos a construir contra los encabezados de Linux más nuevos en lugar de los encabezados proporcionados por libc6-dev. Mi progtwig solo se ejecutará en este o en nuevos kernels, pero eso está bien.

#include la primera línea para que sea: #include y ejecute:

 gcc -I/usr/src/linux-headers-$(uname -r)/include -I/usr/src/linux-headers-$(unam -r)/arch/x86/include dead.c 

Ahora estoy recibiendo página tras página de errores y advertencias. Esto no parece el camino a seguir.

¿Cuál es la forma correcta de crear un progtwig de espacio de usuario con encabezados de Linux más nuevos que los que proporciona libc?

Y posteriormente, ¿cómo puedo construir el progtwig anterior?

sched_setattr() es un syscall y parece que no tiene una envoltura libc de uno a uno. Podrías hacer el envoltorio tú mismo, algo como esto:

 #define _GNU_SOURCE #include  #include  #include  #include  #include  #include  #include  struct sched_attr { uint32_t size; /* Size of this structure */ uint32_t sched_policy; /* Policy (SCHED_*) */ uint64_t sched_flags; /* Flags */ int32_t sched_nice; /* Nice value (SCHED_OTHER, SCHED_BATCH) */ uint32_t sched_priority; /* Static priority (SCHED_FIFO, SCHED_RR) */ /* Remaining fields are for SCHED_DEADLINE */ uint64_t sched_runtime; uint64_t sched_deadline; uint64_t sched_period; }; static int sched_setattr (pid_t pid, const struct sched_attr *attr, unsigned int flags) { return syscall (SYS_sched_setattr, pid, attr, flags); } int main (int argc, char *argv[]) { struct sched_attr attr; int res; memset (&attr, 0, sizeof (struct sched_attr)); attr.size = sizeof (struct sched_attr); res = sched_setattr (getpid (), &attr, 0); if (res < 0) { perror ("sched_setattr"); return 1; } return 0; } 

Al struct sched_attr los errores informados al intentar incluir los archivos de encabezado de kernel necesarios para obtener la definición de struct sched_attr y leer los comentarios encontrados en Google "encabezados de kernel en el espacio del usuario", realmente no puedo sugerir intentar incluir archivos de encabezado de kernel solo para esto .