首页 > 试题广场 >

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

[单选题]
请问下面的程序一共输出多少个 “-”()
int main(void)
{
    int i;
    for (i = 0; i < 2; i++) { 
        fork(); 
        printf("-"); 
    } 
    return 0; 
} 
  • 2
  • 4
  • 6
  • 8
编辑于 2015-12-09 00:17:13 回复(8)

fork()系统调用的特性,

  • fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。
  • 还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。

可以参考陈皓对这道题的解析:
http://coolshell.cn/articles/7965.html
发表于 2015-05-24 18:35:11 回复(6)
发表于 2018-09-04 16:44:44 回复(7)
D
【解析】
一共调用了6次printf,但是会输出8个-。因为父进程的输出缓冲也会被子进程复制
fork(); // i=0
    printf("-");    // buffer="-"
    fork(); // i=1
        printf("-");    // +1
    printf("-");
printf("-")
fork(); // i=1
    printf("-");    // +1
printf("-")


编辑于 2021-12-22 14:42:42 回复(9)
看了这么多位大神的解释之后,,我还是没看懂。。。
发表于 2015-09-24 00:28:41 回复(3)
我的理解不知道对不对,首先父进程的输出缓冲区是空的,然后fork()一个子进程,子进程输出两次,每次都读一遍父进程的缓冲区,为空,所以只输出两次,然后父进程输出一次,接着fork()第二个子进程,该子进程也输出两次,每次输出都读一遍父进程缓冲区,所以多两次,再加上父进程的第二次输出,总共8次。
发表于 2015-03-14 15:44:50 回复(0)
X 代替 _
0  第一次 主进程缓存中存有一个X  子进程1存有一个X
1  第二次  主进程右写入一个X,此时2俩个X,同时产生的子进程2,继承主进程的所有,包括它的缓         存,所以在调用printf时,子进程2的缓存中已经有了一个X,在写入一个X,也是2俩个X
    此时子进程1的情况与主进程一致,产生的子进程3与子进程2情况一致
2  不满足条件,主进程 子进程1 2 3都将清空缓存,所以出现4对 XX,总共8个X,即总共8个_
发表于 2015-09-01 23:09:14 回复(1)
本来是6个,但是由于print有缓冲,在输出时会将-放大缓冲区,从而调用fork()时,会复制缓冲区的-到子进程中,多了两个,,所以是8个
发表于 2015-09-05 18:21:47 回复(2)
printf()是行缓冲,也就是说,这行没有\n就不会主动结束缓冲,那么好了!这题要是将printf("-")改成printf("-\n")呢?
发表于 2015-09-06 10:10:50 回复(1)
拆解成:
int main()
{
  fork();
  printf("-");
  fork();
  printf("-");
  return 0;
}
比较好理解一些。
发表于 2017-07-13 18:19:28 回复(0)
不知道
发表于 2016-03-01 21:53:07 回复(0)
1.fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。
2.还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。
所以,上面的那个程序为什么会输入8个“-”,这是因为printf(“-“);语句有buffer,所以,对于上述程序,printf(“-“);把“-”放到了缓存中,并没有真正的输出,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。
发表于 2015-09-05 18:20:50 回复(0)
发表于 2018-05-13 17:21:04 回复(1)
编辑于 2023-05-01 20:14:54 回复(0)
发表于 2022-03-14 11:31:17 回复(1)
主函数中有一个循环,也就是2个fork,这样的话,派生两个相同的进程,一共3个相同的进程,每个进程打印2个符号,一共6个。 但是由于父进程printf一个符号在初始化的时候已经放在缓存区,子进程会对这个符号进行复制,并在返回时释放
编辑于 2021-03-19 18:11:22 回复(0)
forkye会继承缓冲区的数据 这题若输出printf("-\n");就只会有6个
发表于 2019-01-28 23:37:47 回复(0)
我怀疑我学了一个假的c和c++,我在书上就没有看到过,求推荐啊哪写书有系统介绍
发表于 2018-04-30 17:30:50 回复(3)
我觉得上面那张图片就说的和明白了。

以下是结论,如果有换行符的话,则输出就是6,没有的话就是8
如果改成i<3,有换行符的话就是14,没有换行符的话就是24
发表于 2017-09-20 19:26:29 回复(0)
i=2时,答案是6个-。
fork(); // i=0    fu
    printf("-");    // fu
    fork(); // i=1    fu
        printf("-");    //fu
    printf("-");    // i=1 zi
printf("-")    //i=0 zi
fork(); // i=1 zi
    printf("-"); //zi
i=1,输出p1=2个;
i=2,输出p2= 6个;
i=3,输出p3=14个;
i=n,输出p(n)=2*p(n-1)+2个
编辑于 2016-04-03 11:01:46 回复(1)