【发布时间】:2013-07-11 22:15:05
【问题描述】:
我正在尝试使用原始克隆系统,但找不到任何合适的文档。 我试图编写一个小程序来尝试它,但这最终导致了分段错误。
我不明白我错在哪里。
这是一个小应用程序:
define STACK_SIZE 0x10000
define BUFSIZE 200
#define _GNU_SOURCE
void hello (){
fprintf(stderr,"Hello word\n");
_exit(0);
}
int main()
{
int res;
void *stack = mmap(0, STACK_SIZE, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
pid_t ptid, tid;
printf("Stack %p\n", stack + STACK_SIZE);
memset(stack, 0, STACK_SIZE);
res= syscall(SYS_clone,CLONE_SIGHAND|CLONE_FS|CLONE_VM|CLONE_FILES,stack + STACK_SIZE, &tid,&ptid,NULL );
if (!res)
hello();
printf("Clone result %x\n", res);
waitpid(-1, NULL, __WALL);
return 0;
}
【问题讨论】:
-
不要使用
clone系统调用(基本上是为线程库实现者保留的)。使用pthread库。 -
我需要使用它,因为我正在处理系统调用。
-
您还需要
futex系统调用,这需要一些特定于机器的汇编代码。你应该解释为什么你不能使用 pthreads,你应该深入内核源代码以了解正在发生的事情。
标签: c linux linux-kernel fork system-calls