首页 > 试题广场 >

下列程序会打印出多少个"-"?

[单选题]
for (int i = 0; i < 2; i++)
{
    fork();
    printf("-\n");
}
会打印出多少个"-"?
  • 4
  • 5
  • 6
  • 8
推荐
答案:C
fork()函数是通过系统调用实现进程的拷贝。
第一次for循环,执行完fork函数之后,系统中有两个一模一样的进程,并且都执行到printf函数处,这一次循环会打印出两个“ - ”符号
第二次进入for循环,经过fork函数,第一次循环中产生的两个进程分别再次分裂,这时会有4个进程打印 “-”符号,
所以最终结果是6个。
编辑于 2015-01-31 14:59:00 回复(4)
先看这段代码: 
int main(void)
{
   int i;
   for(i=0; i<2; i++){
      fork();
      printf("-");
   }
 
   wait(NULL);
   wait(NULL);
 
   return 0;
}

1.fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。
2.还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。
所以,上面的那个程序为什么会输入8个“-”,这是因为printf(“-“);语句有buffer,所以,对于上述程序,printf(“-“);把“-”放到了缓存中,并没有真正的输出,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。

而本题
printf("-\n");

程序遇到“\n”,或是EOF,或是缓中区满,或是文件描述符关闭,或是主动flush,或是程序退出,就会把数据刷出缓冲区。需要注意的是,标准输出是行缓冲,所以遇到“\n”的时候会刷出缓冲区,但对于磁盘这个块设备来说,“\n”并不会引起缓冲区刷出的动作,那是全缓冲,你可以使用setvbuf来设置缓冲区大小,或是用fflush刷缓存。
发表于 2015-08-21 14:02:00 回复(4)
C
对于这种N次循环的情况,执行printf函数的次数为2*1+2+4+……+2N-1 )次,创建的子进程数为1+2+4+……+2N-1 个。


发表于 2015-01-19 19:22:23 回复(0)
http://coolshell.cn/articles/7965.html
这道题有两种题型:上面是解释的很好的博客
发表于 2016-08-12 21:30:21 回复(0)
fork()函数是通过系统调用实现进程的拷贝。
第一次for循环,执行完fork函数之后,系统中有两个一模一样的进程,并且都执行到printf函数处,这一次循环会打印出两个“ - ”符号

第二次进入for循环,经过fork函数,第一次循环中产生的两个进程分别再次分裂,这时会有4个进程打印 “-”符号,
所以最终结果是6个。
发表于 2022-08-16 23:58:58 回复(0)
发表于 2017-03-01 20:26:48 回复(0)
炫头像
fork函数总是“调用一次,返回两次”
发表于 2016-01-02 13:34:19 回复(0)
表示不懂,下面的答案即有6个,又有8个。那么到底哪个才是正确的?
发表于 2019-07-13 09:28:31 回复(0)
fork和printf都是啥功能。这个题目问的好莫名其妙。
发表于 2015-01-13 14:48:10 回复(1)
其实 这个题目的本意不是这样的,应该是printf("-");  那么这样的话打印出来就是8个,考什么时候刷缓冲区,不然这个题目就太小儿科了
发表于 2016-08-31 12:42:53 回复(0)
我觉得选D ,8个,printf有缓存,在fork的时候缓存中的'-'也被复制了
编辑于 2015-07-28 23:02:06 回复(1)
fork()在创建一个进程,第一次2,第二次4,一共6
发表于 2015-07-28 15:53:25 回复(0)
fork函数的核心在于复制父进程的代码段,数据段,堆栈资源的副本。
发表于 2015-07-03 10:52:34 回复(0)