вот код с комментариями (основную часть не имеющую отношения к делу опустил):
Код | #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(). вроде подключил все необходимые заголовочные файлы. может кто сталкивался с такой проблемой? |