2011-02-02 15 views
6

He sobrecargado la llamada al sistema fork() y he creado mi propia versión de fork() usando RTLD_NEXT. Es decir, dlsym(RTLD_NEXT, fork). Esto afectará mi versión de tenedor. Después de esto quiero replicar la tarea de la llamada al sistema actual fork(), es decir, crear el proceso hijo y devolver el pid, y algunas funcionalidades adicionales adicionales.Sobrecarga de la horquilla()

No soy capaz de encontrar la manera de hacerlo. Revisé el código fuente del kernel para fork() (fork.c) y no pude entender mucho.

Hacer esto:

dlsym(RTLD_NEXT,fork); 
int fork(void) { 
    int pid=_fork(); // Trying to call actual fork does not work 
    return pid; 
} 

¿Cómo puedo hacer eso? Aquí está el enlace al núcleo código fuente de tenedor: http://lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10

Editar (retirado desde comentarios):

estoy trabajando en una fuga herramienta de detección, y esta herramienta detecta una doble liberación cuando un proceso hijo borra la memoria asignada por el padre. Para superar esto anularé fork(), y cada vez que haya un fork(), la tabla de asignación de memoria del padre se duplicará al niño.

+0

¿Qué quiere decir con "does not work"? ¿Errores en tiempo de ejecución? ¿Errores del compilador? – Simone

+0

@Simone: _fork(); // Error: _fork no fue declarado. Mi idea era hacer que golpeara la versión actual del kernel de la horquilla y no la mía. Espero que quede claro ahora. – kingsmasher1

+0

¿Qué es exactamente lo que quieres lograr al hacer esto? ¿Cuál es tu objetivo final? – Omnifarious

Respuesta

3

Debería poder llamar al fork real con syscall(SYS_fork) después de incluir <sys/syscall.h>. Ver syscall(2).

+0

No estaba seguro de que realmente hubiera una llamada al sistema 'fork'. Pensé que se había traducido a una llamada 'clon' con un conjunto particular de parámetros. – Omnifarious

+0

@larsmans: ¡¡Eso da una buena idea !! Estupendo. Déjame probar eso ahora y ver si funciona. – kingsmasher1

+0

@Omnifarious: todavía funciona. Compatibilidad hacia atrás, supongo. –

7

No obtendrá nada útil del código fuente del kernel para fork. Su código no podrá hacer las cosas que hace el kernel, sin importar el truco de la biblioteca que administre. Ese es un límite difícil que no se puede violar sin escribir un módulo kernel.

Todo el código de la biblioteca para fork hace es configurar cosas y ejecutar una instrucción especial que cambia al modo kernel donde se ejecuta el código fork del kernel. Hay una forma de poner esta instrucción especial en su propio código. Es la función syscall. Dado que fork no toma argumentos, debería ser relativamente fácil usar esta función para realizar la llamada al sistema.

Pero esto no es lo que te recomiendo que hagas. Te recomiendo hacer esto en su lugar:

typedef int (*forkfunc_t)(void); 

int fork(void) 
{ 
    forkfunc_t sysfork = (forkfunc_t)dlsym(RTLD_DEFAULT, "fork"); 
    return sysfork(); 
} 

Básicamente, cualquiera que sea compartida hackery biblioteca lo hace, se debe básicamente encontrar alguna manera de recuperar el valor previo de la función fork antes de que se sustituya por su propia cuenta.

+0

Estoy trabajando en una herramienta de detección de fugas, y esta herramienta detecta una doble libre cuando un proceso secundario elimina la memoria asignada por el padre. Para superar esto anularé fork(), y siempre que haya un fork(), la tabla de asignación de memoria del padre se duplicará al hijo. – kingsmasher1

+0

@ kingsmasher1: Ahh, así que no necesita modificar lo que el núcleo está haciendo con 'fork', solo necesita asegurarse de interceptarlo y envolverlo adecuadamente. Eso es muy factible, y su técnica de biblioteca compartida no es una mala manera de hacerlo. – Omnifarious

+0

@ kingsmasher1 Edité tu comentario en tu pregunta, ya que es una información bastante importante. Si no está satisfecho con esto, adelante y edítelo. –

0

Desde hacen trizas mal, de todos modos, ¿por qué no utilizar una macro

#define fork() (spoon(),fork()) 

o

#define fork() spoon(fork()) 

donde spoon es entonces función que hace las cosas que desea lograr.

El preprocesador está garantizado para no hacer recursividad y dejar el fork dentro de la expansión solamente.

+0

mi problema no era cómo sobrecargar la horquilla(). Pude sobrecargarlo usando "dlsym" sys call. Mi problema era cómo replicar el trabajo de fork(), de todos modos he podido lograr eso ahora usando la sugerencia de larsman y mi problema está resuelto. Thatnks de todos modos. – kingsmasher1

Cuestiones relacionadas