Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > проблема с вызовом clone() из модуля


Автор: RasenHerz 30.3.2008, 18:39
вот код с комментариями (основную часть не имеющую отношения к делу опустил):
Код

#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/current.h>
#include <asm/thread_info.h>
#include <linux/sched.h>
#include <linux/unistd.h>
#include <linux/mm.h>

#define STACKSIZE 4096 //4 Кб должно хватить, т.к. после создания процесса он будет замещен

typedef void (*CH_CALL)(void*);
typedef void** CH_STACK;
typedef void* CH_DATA;

pid_t my_mod_create_child(CH_CALL, CH_DATA, int);
int my_mod_child_fn(CH_DATA);

int init_module(){
  my_mod_create_child((CH_CALL)&my_mod_child_fn, 0, STACKSIZE);
  return 0;
}

void cleanup_module(void){
}

pid_t my_mod_create_child(CH_CALL call_adr, CH_DATA data, int stack_size)
{
  CH_STACK stack = (CH_STACK)kmalloc(stack_size,GFP_KERNEL); //выделяю в ядре память для стека этого процесса.
  if(!stack) return -1;
  stack = (stack_size + (char*)stack);
  if(clone(call_adr, stack, SIGCHLD, data) < 0) return -1; //вот тут то и вся проблема: компилятор выдает "implicit declaration of function 'clone'"
                                                           //хотя все заголовочные файлы подключены, думаю здесь какая-то заморочка как с malloc
                                                           //(напоминаю, функция malloc заменена на kmalloc в ядрах версии >= 2.6)
  return 0;
}

MODULE_LICENSE("GPL");


совсем не пойму, почему компилятор не может найти ф-цию clone()! такая же ерунда и с exec(). вроде подключил все необходимые заголовочные файлы. может кто сталкивался с такой проблемой?

Автор: kirjanov 30.3.2008, 19:16
Насколько мне известно, (поправте если что), в ядре для создания процессов используется функция do_fork, которая вызывается из функций sys_fork, sys_vfork и sys_clone. Для создания  котекста процесса в ядре существуют аппаратно-зависимый интерфейс в виде функции:
Код

int kernel_thread (int (*fn)(void *), void * arg, unsigned long flags);

То же дело обстоит с функцией exec и соответствующим ей вызовом sys_execve.

Автор: MAKCim 30.3.2008, 20:05
Цитата(kirjanov @  30.3.2008,  19:16 Найти цитируемый пост)
аппаратно-зависимый интерфейс в виде функции:

есть еще более обобщенная функция kthread_create() из kernel/kthread.c
которая позволяет кроме всего прочего присвоить символьный идентификатор порожденному процессу и связать его с определенным процессором 
Цитата(kirjanov @  30.3.2008,  19:16 Найти цитируемый пост)
То же дело обстоит с функцией exec и соответствующим ей вызовом sys_execve. 

да, do_execve()
но т. к она (так же как и do_fork()) не экспортируется, отобразить исполняемый файл/библиотеку не удасться

Автор: kirjanov 30.3.2008, 20:13
Цитата

но т. к она (так же как и do_fork()) не экспортируется

Что и не удивительно  smile 

Автор: MAKCim 30.3.2008, 20:22
Цитата(kirjanov @  30.3.2008,  20:13 Найти цитируемый пост)
Что и не удивительно

почему?

Автор: kirjanov 30.3.2008, 20:40
Мое мнение, что эта функция относится в кухне подсистемы управления процессам, и не должна использоваться загружаемыми модулями.  

Автор: MAKCim 30.3.2008, 20:58
Цитата(kirjanov @  30.3.2008,  20:40 Найти цитируемый пост)
Мое мнение, что эта функция относится в кухне подсистемы управления процессам, и не должна использоваться загружаемыми модулями.   

именно по поводу do_fork() не согласен
она позволила бы более гибко создавать процессы
kernel_thread() и kthread_create() довольно абстрактны

Автор: RasenHerz 31.3.2008, 18:26
а в каком заголовочном файле декларирована sys_clone()??? в linux/shed.h ее нет...

Автор: MAKCim 31.3.2008, 21:06
RasenHerz
arch/<arch>/kernel/process.c
asm/unistd.h

Автор: kirjanov 31.3.2008, 22:07
RasenHerz
я не открываю Америку, но в директории с исходным кодом можно, например, набирать grep -nr "some text to search" . Помогает  smile 

Автор: RasenHerz 1.4.2008, 06:27
кто ж знал что она не в *.h файле )))

Автор: MAKCim 1.4.2008, 09:16
Цитата(RasenHerz @  1.4.2008,  06:27 Найти цитируемый пост)
кто ж знал что она не в *.h файле ))) 

объявление в .h файле

Добавлено через 44 секунды
RasenHerz
рекомендую ознакомиться с http://www.linux-m32r.org/lxr/http/ident системой

Автор: RasenHerz 1.4.2008, 12:32
есть прототип только для powerpc. я уже сам написал ф-цию создающую дочерний процесс ( и без sys_fork()). тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)