Я перегрузил системный вызов fork()
и создал собственную версию fork()
, используя RTLD_NEXT. То есть dlsym(RTLD_NEXT, fork)
. Это ударит по моей версии форка. После этого я хочу воспроизвести задачу реального системного вызова fork()
, то есть создать дочерний процесс и вернуть pid, а также еще некоторые дополнительные функции.
Я не могу понять, как это сделать. Я проверил исходный код ядра для fork()
(fork.c) и не смог многого понять.
Делая это:
dlsym(RTLD_NEXT,fork);
int fork(void) {
int pid=_fork(); // Trying to call actual fork does not work
return pid;
}
Как я могу это сделать? Вот ссылка на исходный код ядра для форка: http://lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10
Изменить (извлечено из комментариев):
Я работаю над инструментом обнаружения утечек, и этот инструмент обнаруживает двойное освобождение, когда дочерний процесс удаляет память, выделенную родителем. Чтобы преодолеть это, я переопределю fork()
, и всякий раз, когда есть fork()
, родительская таблица распределения памяти будет дублироваться дочерней.
int my_fork(void) { /* do stuff */; return fork(); }
А в шапке:extern int my_fork(void); #define fork my_fork
. - person Chris Lutz   schedule 02.02.2011the parent's memory allocation table will be duplicated to the child.
Уже так работает fork(): у родителя и потомка одинаковые копии карты памяти, но в разных аренах. Если ребенок свободен (s), родитель этого не заметит, и наоборот. - person wildplasser   schedule 02.03.2015