vfork()创建的进程与父进程共用页表,子进程创建之后会阻塞父进程执行,直至执行结束,详见man手册。
下面是两段相似的创建进程的代码及其执行结果:
fork()函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int pid = fork();
if (pid < 0) {
printf("fork error\n");
exit(1);
} else if (pid == 0) {
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
} else {
printf("Goodbye\n");
}
return 0;
}
执行结果如下:
Goodbye
Hello
Hello
Hello
Hello
Hello
Hello
vfork函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int pid = vfork();
if (pid < 0) {
printf("fork error\n");
exit(1);
} else if (pid == 0) {
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
printf("Hello\n");
exit(0);
} else {
printf("Goodbye\n");
}
return 0;
}
其执行结果如下:
Hello
Hello
Hello
Hello
Hello
Hello
Goodbye