Chinaunix首页 | 论坛 | 博客
  • 博客访问: 305297
  • 博文数量: 33
  • 博客积分: 132
  • 博客等级: 入伍新兵
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-16 22:24
个人简介

学习计算机科学与技术专业,喜欢计算机,喜欢linux,喜欢编程

文章存档

2014年(7)

2013年(12)

2012年(14)

分类: C/C++

2014-08-06 10:55:05

一个腾讯的校招程序题:

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4.     
  5. int main(void)
  6. {
  7.    int i;
  8.    for(i=0; i<2; i++)
  9. {
  10.       fork();
  11.       printf("-");
  12.  }
  13.     
  14.    return 0;
  15. }

它的输出结果是多少个 “ - ” 呢?对fork()函数熟悉的人都会回答是:6个。
但是真的是 6个 吗?我在我的 fedora 18 gcc 4.7.2测试的结果是:8个。

在说明原因之前我们先来看看 fork() 函数的特点:
  1. fork()是Unix/Linux下创建进程的函数,一次调用,两次返回。返回 0 表示子进程,<0 表示创建失败,>0 表示返回父进程,并且返回这个数是子进程的 pid。(PS:这个 pid 在父子进程通讯的时候是非常有用的)
  2. fork()创建进程时是从自己当前的位置复制父进程到子进程中,复制的过程中包括复制各种变量、栈、缓冲区等信息。(也许有人会说不是写时复制吗?的确是写时复制,这里我笼统的说是复制)

那么为什么是这个结果呢?
重点就在于那个缓冲区。在 printf() 的时候会有缓冲区,而 fork() 在将父进程复制给子进程的时候也将 printf() 缓冲区的内容也进行了复制。因此在 fork() 进行了两次调用,也就是说复制了两次的缓冲区内容,这就是多出来的那 2 个 "-"。

printf() 函数有行缓冲区,也就是说当一行内容完成后才进行写入。由于每一行可以用 "\n" 作为该行结束的标志,因此 "\n" 具有清除行缓冲区的作用,当然了,你也可以在每一个 printf() 后面加上 fflush() 用来清除缓存。

下面的两个是我们想要的结果,都是输出 6 个 "-"
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4.     
  5. int main(void)
  6. {
  7.    int i;
  8.    for(i=0; i<2; i++)
  9. {
  10.       fork();
  11.       printf("-\n");
  12.  }
  13.     
  14.    return 0;
  15. }
或者:
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4.     
  5. int main(void)
  6. {
  7.    int i;
  8.    for(i=0; i<2; i++)
  9. {
  10.       fork();
  11.       printf("-");
  12.       fflush(stdout);
  13.  }
  14.     
  15.    return 0;
  16. }








阅读(2447) | 评论(0) | 转发(0) |
0

上一篇:python 类中的 self 问题

下一篇:没有了

给主人留下些什么吧!~~