首页 > 试题广场 >

请问下面的程序一共输出多少个“-”?

[单选题]
// 请问下面的程序一共输出多少个“-”?为什么?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void) {
    int i;
    for (i = 0; i < 2; i++) {
        fork();
        printf("-\n");
    }
    return (0);
}
  • 4
  • 5
  • 6
  • 8
答案:C
解题:
1.想不出来,最简单的就是去运行下,运行后是6个,所以选C(要在linux下才行,Windows的话要用cygwin这类的模拟linux)
2.有2个难点:
1).fork()是怎么执行的,看http://jingyan.baidu.com/article/36d6ed1f3f05c71bcf4883c3.html
2).printf及I/O的缓冲问题,可以试试运行printf("-");和printf("-");fflush(stdout);
编辑于 2016-05-12 20:59:19 回复(1)
 本体在window下和linux下答案不一致!!!
windows下测试发现,\n并没有清除缓存的作用..
fflush(stdout);这个才能清除缓存

大家可以到这里测试一下
把本题题目输入进去,去不去掉\n 结果都是8个‘-’

发表于 2017-04-18 22:50:19 回复(2)
C:fork在于拷贝了一个和当前进程一模一样的进程,从fork方法return开始,已有两份相似的进程在运行,考的知识点在于fork()方法的准确理解以及对递归的理解
发表于 2015-03-30 13:36:34 回复(0)
1.printf("-\n");对于行输出/n有清除缓存的作用;
2.fork()可以复制父进程的缓存,变量值等信息;
3.i=0时,父进程A产生一个子进程A1,此时输出两行“-”;
4.i=1时,fork使父进程A产生子进程A2,A1产生子进程A3,此时A-A3***生4行“-”(因为现在A,A1的输出行缓冲均为空);
总数为6:2(A)+2(A1)+1(A2)+1(A3)=6;
对比http://www.nowcoder.com/profile/594239/test/1146384/7254#summary
由于A2,A3会继承A和A1的输出行缓冲区,所以会分别输出两个“-”,加起来为:2(A)+2(A1)+2(A2)+2(A3)=8;
发表于 2015-09-05 17:53:11 回复(9)
  int i;
   for(i=0; i<2; i++){
      fork();
      printf("-");
   }

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-09-05 18:21:38 回复(2)
注意printf("-\n");与printf("-");的不同,前者直接输出,后者存在缓冲区中
发表于 2015-09-05 16:07:36 回复(5)
yql头像 yql
我叫搬运工!http://coolshell.cn/articles/7965.html
发表于 2015-09-20 13:38:30 回复(2)

fork复制进程。原进程创建两个子进程,第1个子进程再创建一个孙子进程,共四个进程并发执行。输出6个“-”。

发表于 2022-04-23 15:51:06 回复(0)
这个题是故意找茬的吗???我前面选的6,你告诉我错了,是8,几个星期了,我再来做这个题,***你又变6了,你到底行不行....
发表于 2016-11-14 22:04:21 回复(3)
i=0时,父进程生成一个P1,子进程生成一个S1
i=1时,父进程再生成一个P2,同时又生成一个子进程S2
            同时,子进程S1又承担父进程的职责生成B1,且又生成一个孙进程B2


发表于 2023-09-17 13:45:12 回复(0)
windows下使用fflush(stdout)才可以清除掉缓存。

发表于 2017-11-29 21:28:59 回复(2)
发表于 2017-11-24 14:54:46 回复(0)

这个问题涉及到Unix/Linux中的fork()系统调用和进程的概念。fork()会创建一个新的进程,这个新进程是当前进程的副本,称为子进程。子进程会获得父进程代码的一份拷贝,并从fork()调用之后的那一点开始执行。

现在,我们分析程序:

  1. 初始时,有一个父进程。
  2. 第一次进入循环,fork()被调用,此时会产生一个子进程。现在有两个进程:父进程和子进程1。
  3. 两个进程(父进程和子进程1)都会执行printf("-\n");,因此会输出两个“-”。
  4. 第二次进入循环,每个进程(父进程和子进程1)再次调用fork()。父进程产生子进程2,子进程1产生子进程3。现在共有四个进程:父进程、子进程1、子进程2和子进程3。
  5. 这四个进程都会执行printf("-\n");,因此会再输出四个“-”。

综上所述,程序总共会输出 2(第一次循环)+ 4(第二次循环)= 6 个“-”。

因此,正确答案是:
C
6

编辑于 2024-04-02 14:56:08 回复(0)
惯性思维了,没看见\n……
发表于 2022-03-12 22:22:32 回复(0)
1.printf("-\n");对于行输出/n有清除缓存的作用;
2.fork()可以复制父进程的缓存,变量值等信息;
3.i=0时,父进程A产生一个子进程A1,此时输出两行“-”;
4.i=1时,fork使父进程A产生子进程A2,A1产生子进程A3,此时A-A3***生4行“-”(因为现在A,A1的输出行缓冲均为空);
总数为6:2(A)+2(A1)+1(A2)+1(A3)=6;
对比http://www.nowcoder.com/profile/594239/test/1146384/7254#summary
由于A2,A3会继承A和A1的输出行缓冲区,所以会分别输出两个“-”,加起来为:2(A)+2(A1)+2(A2)+2(A3)=8;
发表于 2021-11-30 08:34:38 回复(0)
i=0 分裂成两个子进程,然后会继承全部。然后因为有\n所以直接就输出了两个。
然后两个进程独立i++,然后继续fork,2个变四个。然后就是2+2+1+1.
发表于 2020-09-16 16:06:48 回复(0)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
 
int main(void) {
   int i;
   for (i=0; i<2; i++) {
      fork();
      printf("-\n");
   }
   return 0;
}
这题目老是变,看别人的回答也看不出什么来。我把我做题时的代码也附上好了。
这题有点绕。
  1. 首先,父进程会printf两次。
  2. 父进程fork出的第一个子进程1,会先printf一次,然后i+1此时i为1,再次进入循环体,子进程1也会fork出它的子进程11,fork返回后子进程1再printf一次。而子进程11中fork返回后也会printf一次,再i+1,此时i为2,不再进入循环体。
  3. 父进程fork出的第二个子进程2,会先printf一次。然后i+1,此时i为2,不再进入循环体。
总共就是6次。
推导的原则就是:
  • fork会返回两次,一次父进程,一次子进程,由于这里没有通过返回值判断是父进程还是子进程,所以这两个都会往后执行
  • fork后父子进程的数据完全一样,并且有写时复制。可以认为类似递归传值,所以每次fork之后i的值都在原来的基础上变化,且不会影响到原来的变量。
发表于 2020-08-27 16:51:29 回复(0)
画图
发表于 2019-06-12 00:50:31 回复(0)
当i位0时,进入循环,fork变为两个进程,都执行printf,当i位1时两个进程都进入循环,分别fork各自在产生子进程,四个进程分别执行printf
发表于 2018-07-24 23:16:44 回复(0)
我想问的问题是,如果输出没带‘\n’,那么8个‘-’
通过for循环产生的4个进程的输出的个数是1,2,2,3还是2,2,2,2?
求解答。
编辑于 2018-06-03 00:16:27 回复(0)