Простой тестовой программы, я ожидаю, что это будет «клон» раскошелиться дочерним процесс, и каждый процесс может выполнять до его концаCalling «клон()» на Linux, но это, кажется, сбои
#include<stdio.h>
#include<sched.h>
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
int f(void*arg)
{
pid_t pid=getpid();
printf("child pid=%d\n",pid);
}
char buf[1024];
int main()
{
printf("before clone\n");
int pid=clone(f,buf,CLONE_VM|CLONE_VFORK,NULL);
if(pid==-1){
printf("%d\n",errno);
return 1;
}
waitpid(pid,NULL,0);
printf("after clone\n");
printf("father pid=%d\n",getpid());
return 0;
}
Ru его:
$g++ testClone.cpp && ./a.out
before clone
Это не печатало то, что я ожидал. Кажется, что после «клонирования» программа находится в неизвестном состоянии, а затем завершает работу. Я попытался GDB и печатает:
Breakpoint 1, main() at testClone.cpp:15
(gdb) n-
before clone
(gdb) n-
waiting for new child: No child processes.
(gdb) n-
Single stepping until exit from function [email protected],-
which has no line number information.
Если удалить строку «waitpid», затем GDB печатает другой вид странной информации.
(gdb) n-
before clone
(gdb) n-
Detaching after fork from child process 26709.
warning: Unexpected waitpid result 000000 when waiting for vfork-done
Cannot remove breakpoints because program is no longer writable.
It might be running in another process.
Further execution is probably impossible.
0x00007fb18a446bf1 in clone() from /lib64/libc.so.6
ptrace: No such process.
Где я ошибался в своей программе?