Не совсем уверен, куда это поместить, потому что это не совсем ответ, но, возможно, он направит вас в правильном направлении. Вот некоторый код, который прошивает/перехватывает fork()
, написанный на C. В данном случае он был написан для определения того, разветвляется ли программа в песочнице более двух раз, но вы, очевидно, можете изменить поведение по мере необходимости.
#define MAKE_CALLTHROUGH(fx, libfx) \
do{ \
void *handle = NULL; \
if(!libfx){ \
handle = dlopen("/lib64/libc.so.6", RTLD_LAZY); \
if(!handle){ \
fputs(dlerror(), stderr); \
exit(1); \
return 0; \
} \
libfx = dlsym(handle, fx); \
if(dlerror() != NULL){ \
fprintf(stderr, "Could not make handle for function %s\n", fx);\
exit(1); \
} \
} \
}while(0);
const int MAX_FORKS = 2;
int forks = 0;
int fork(){
static int (*libfork) (void) = NULL;
MAKE_CALLTHROUGH("fork", libfork);
if(forks++ > 2){
fprintf(stderr, "Illegally exceeded 2 forks.\n");
killpg(0, 9);
}
return libfork();
}
Если кому интересно, я скомпилировал вот так:
gcc -g -Wall -Wextra -fPIC -c watchshim.c -o watchshim.o
gcc -g -Wall -Wextra -fPIC -shared -ldl watchshim.o -o watchshim.so
gcc -g -Wall -Wextra -pthread -o watch watch.c
Где watchshim.c
— это файл, содержащий код прокладки/перехвата, а watch.c
— это процесс, в котором fork()
прошивается (оно также прошивается во всех дочерних процессах watch
. "/lib64/libc.so.6"
— это so
, содержащий исходный fork()
. У меня есть MAKE_CALLTHROUGH
, написанный как макрос , потому что я использовал несколько функций в проекте, в котором использовал это.
person
nchen24
schedule
10.12.2014