Не уверен, где это положить, потому что это не совсем ответ, но, возможно, он поместит вас в правильном направлении. Вот некоторый код, который перемычки/крючки 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
, написанный как макрос, потому что я выполнял несколько функций в проекте, в котором я использовал это.