새 네임 스페이스로 프로세스를 만들려고하는데,이를 위해 적절한 플래그와 함께 clone (2)을 사용해야합니다. 다음은 복제 시스템 호출과 printf () 문을 사용하여 부모 PID를 인쇄합니다.
printf("clone() = %ld\n", (long)getpid());
printf("PID: %ld\n", (long)getpid());
struct utsname utsname;
uname(&utsname);
printf("parent namespace hostname: %s\n", utsname.nodename);
clone(child_main(&process_struct, checkpoint), stack + process_struct.Stack,
CLONE_NEWCGROUP
|CLONE_NEWIPC
|CLONE_NEWNET
|CLONE_NEWNS
|CLONE_NEWPID
|CLONE_NEWUTS|SIGCHLD, &process_struct)
그리고 child_main () 함수, 자식 함수는 호스트 이름을 설정 한 다음 자식의 PID를 인쇄합니다. 문제는 시스템의 호스트 이름이 네임 스페이스의 호스트 이름뿐만 아니라 자식의 PID가 부모와 동일하다는 것입니다. 잘못되었고 네임 스페이스 내의 자식 PID는 1이어야하고 PPID는 0 (부모 없음을 의미)이어야합니다. 또한 sethostname (2)는 자식 프로세스 네임 스페이스에만 영향을 주어야합니다.
int child_main(struct process *process, int *checkpoint){
char c;
fprintf(stderr,"=> IPC setup...");
//double check the IPC
close(checkpoint[1]);
fprintf(stderr,"Done\n");
if ( sethostname(process->Hostname, strlen(process->Hostname)){
//close(process->File_descriptor);
return -1;
}
printf("PID: %ld\n", (long)getpid());
struct utsname utsname;
uname(&utsname);
printf("child namespace hostname: %s\n", utsname.nodename);
// startup the IPC pipes
read(checkpoint[0], &c, 1);
char* argv[]={(char*)0};
if(execve("/bin/bash", argv, NULL) == -1 ){
fprintf(stderr,"--> Launching process Failed %m\n");
return -1;
}
return 0;
}
clone()
그 첫 번째 인수로 함수 포인터를 취 래퍼의 glibc.
함수 포인터를 전달하는 것이 아니라 int
( 복제 를 호출 하기 전에child_main
부모 프로세스에서 호출되는 의 반환 ). 경우 전달 된되어 첫 번째 인수합니다 (로 포인터를 당신의 반환 )는 -1을 반환 및 설정됩니다 에 ,하지만 난 당신이 반환 값을 확인하지 않았다고 생각한다.child_main
NULL
0
child_main
errno
EINVAL
로부터 clone()
맨 :
EINVAL
또는 이 NULL로 지정된clone()
경우 glibc 래퍼 함수에 의해 반환 됩니다.fn
child_stack
따라서 child_main
부모 프로세스에서 실행되고 자식 프로세스 나 네임 스페이스가 생성되지 않으며 child_main
초기 네임 스페이스, 즉 전체 머신에 호스트 이름을 설정합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다