抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Abstract

Preface

Overview

fork and print

  • fork复制资源
  • print内有缓冲区

case 1

如下程序会打印多少-:

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main() {
int i;
for(i=0;i<2;i++) {
fork();
printf("-");
}
return 0;
}

答案是8,因为print有缓冲区,print没换行情况缓冲区,缓冲区继承到了子进程。

1
2
3
4
5
6
7
            -> "__"
-> "-" (不打印,在buffer)
-> "__"
main
-> "__"
-> "-"
-> "__"

case 2

如果是print("-\n");又打印多少个?答案是6个

PS: vim下存在显示问题 。如vim下输入命令:term ./a执行该程序,会打印不确定个’-‘

case 3

如果return换成_exit(0)呢?什么都不打印,因为_exit()不会调用退出处理函数,不会清空缓冲区。而exit()会情况缓冲区和做退出处理。

为什么在vfork中子进程先执行

那得需要了解vfork的应用场景

vfork会让子进程先执行,直到子进程退出或exec父进程才会执行。那么就有如下场景:

  • 父进程需要开子进程完成某些操作后才能继续执行
  • 父进程要exec,但是要保证子进程已经执行完成

评论