Я пытаюсь использовать функцию clone()
в C, и я не уверен, как работает второй аргумент. По справочной странице clone()
:
The child_stack argument specifies the location of the stack used by the
child process. Since the child and calling process may share memory, it
is not possible for the child process to execute in the same stack as the
calling process. The calling process must therefore set up memory space
for the child stack and pass a pointer to this space to clone(). Stacks
grow downwards on all processors that run Linux (except the HP PA proces‐
sors), so child_stack usually points to the topmost address of the memory
space set up for the child stack.
После следующих предложений в комментариях к этой статье я смог получить простой пример работы с этой программой на C:
#include <stdio.h>
#include <sched.h>
#include <stdlib.h>
#include <assert.h>
#define SIZE 65536
int v1;
int run(void *arg) {
v1 = 42;
return 0;
}
int main(int argc, char **argv) {
void **child_stack;
int pid, rc, status;
v1 = 10;
child_stack = (void **) malloc(SIZE);
assert(child_stack != NULL);
printf("v1 before: %d\n", v1);
pid = clone(run, child_stack + SIZE/sizeof(void **), CLONE_VM, NULL);
//pid = clone(run, child_stack + SIZE, CLONE_VM, NULL);
assert(pid != -1);
status = 0;
rc = waitpid(pid, &status, __WALL);
assert(rc != -1);
assert(WEXITSTATUS(status) == 0);
printf("v1 after: %d\n", v1);
return 0;
}
Но я не совсем понимаю, зачем нужна конкретная арифметика указателей в строке clone
. Учитывая, что согласно документам clone
стек должен расти вниз, я понимаю, почему вы должны добавить значение к указателю, возвращаемому malloc
, перед его передачей. Но я ожидаю, что вы добавите число байт malloc'd вместо этого значения, разделенного на 8 (в 64-битной системе), что, по-видимому, действительно работает. Код выше, кажется, работает нормально, независимо от того, что я определяю SIZE
как, но если я использую закомментированную версию вместо этого, что я и ожидал бы работать, я получаю ошибку сегментации для всех значений SIZE выше определенного порога.
Итак, кто-нибудь понимает, почему данная строка clone
работает, а прокомментированная - нет?
Что касается того, почему я для начала использую clone
, вместо fork
или pthreads, я пытаюсь использовать некоторые из его расширенных функций песочницы, чтобы не дать ненадежному процессу вырваться из тюрьмы chroot, как описано здесь .