Как передать параметры в функцию, вызванную clone ()? - PullRequest
4 голосов
/ 03 декабря 2011

Мне нужно использовать системный вызов clone () в main-функции, чтобы получить 2 потока.(Я знаю, есть другие варианты, но в этом случае это должен быть clone ()).

Системный вызов работает, и оба потока приходят в назначенную функцию (foo).Но в этой функции мне нужно, чтобы они вызывали другую функцию с такой подписью:

void increment(int* a, int b)

(Sidenote: добавляет b * 1 к a. (= A + b))

Дело в том, что оба, a и b, объявлены в main-функции, и я не знаю, как передать их в foo.

Я уже пробовал разные вещи, но безуспешно.Я получил подсказку: используйте адаптер.Но я понятия не имею, как это сделать.(Я также не знаю, как использовать args в клоне с int.)

Есть предложения?

Ответы [ 2 ]

4 голосов
/ 03 декабря 2011

Одним из аргументов clone() является void* arg.Это позволяет вам передавать пустой указатель на вашу функцию.Чтобы вместо этого передать указатель int и int, вы должны создать структуру с указателем int и int, присвоенными a и b соответственно, а затем преобразовать указатель на эту структуру в указатель void.Затем внутри функции вы полностью изменяете процесс.

Мой C немного ржавый, и я не скомпилировал его, поэтому не цитируйте его, но это должно выглядеть примерно так:

struct clone_args {
    int* a;
    int b
};

int main(int argc, char* argv[])
{
    struct clone_args args;
    args.a = a;
    args.b = b;
    void* arg = (void*)&args;
    clone(fn, ..., arg, ...);
}

int fn(void* arg)
{
    struct clone_args *args = (struct clone_args*)arg;
    int* a = args->a;
    int b = args->b;
}

Примечание: позаботьтесь о том, чтобы создаваемая структура все еще находилась в области действия при вызове fn, поскольку она не копируется.Возможно, вам придется malloc это.

0 голосов
/ 25 сентября 2014

Вот пример кода:

#define stacksize 1048576  
typedef struct
{
int ii;
int jj;
} someinput1;

static int              /* Start function for cloned child */
childFunc(someinput1 *struc)
{

     printf("Child:  PID=%ld PPID=%ld\n", (long) getpid(), (long) getppid());

     printf("Hi!! I am child process created by Clone %ld \n",(long) getpid());
     printf("Value of x %d %d\n",struc->ii,struc->jj);
} 


int main()
{
someinput1 inputtest;
int i;
char *stack;                    /* Start of stack buffer */
char *stack1;                 /* End of stack buffer */
pid_t pid;


stack = malloc(stacksize);
stack1 = stack + stacksize;  

for (i = 0;i<5;i++)
{
    inputtest.ii = i+5;
    inputtest.jj = inputtest.ii + 10;
    pid = clone(childFunc, stack1, NULL,  (void *) (&inputtest));
    printf("clone returned -- %ld \n", (long) pid);
}

sleep(1);          
exit(EXIT_SUCCESS);
}
...