원시 복제 시스템을 사용하려하지만 적절한 문서를 찾을 수 없습니다. 시도해보기 위해 작은 프로그램을 작성하려고했지만 세그먼트 오류로 끝납니다.Raw 복제 시스템 호출
내가 잘못 된 부분을 이해할 수 없습니다.
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' syscall을 사용하지 마십시오. 기본적으로 스레드 라이브러리 작성자 용으로 예약되어 있습니다. 'pthread' 라이브러리를 사용하십시오. –
시스템 호출로 작업하기 때문에이 프로그램을 사용해야합니다. –
'futex' 시스템 콜이 필요합니다.이 시스템 콜은 일부 기계 고유의 어셈블리 코드가 필요합니다. 왜 pthread를 사용할 수 없는지 설명해야하고, 커널 소스 코드에 대해 이해해야합니다. –