首页 > 试题广场 >

以下程序输出多少个“-”()int main(void)&n

[单选题]
以下程序输出()个“-”
int main(void) {
    int i;
    for (i = 0; i < 2; i++) {
        fork();
        printf("-");
    }
    return 0;
}
  • 2
  • 4
  • 6
  • 8
这道题考的是子进程和行缓冲 printf(“- \n”)直接会输出一个 “-” 而printf("-")没有换行符不会直接输出,会放在缓冲区中等到程序结束后由系统处理输出 第一次循环中经过fork后有两个进程 经过printf("-")之后两个进程缓冲区中都有一个“-” 第二次进入循环经过fork后会有四个进程,且由于fork出的子进程会复制父进程的缓冲区,这时四个进程都有一个"-" 再经过printf("-")之后四个进程都有两个"-" 这时程序结束时会将缓冲区的内容全部输出,即8个"-"
发表于 2020-08-21 23:50:02 回复(12)
直接上图:  输出6个
发表于 2020-08-04 21:18:45 回复(8)
答案:8
                                                进程本身
                                                    | fork
                    子进程  -                             |                    进程本身   -
                         |fork                               |                         |fork
    子进程                        该子进程本身   |    子进程                      该进程本身
(拷贝了其父进程                                   |(拷贝了其父进程      
    的缓冲区)                                          |   的缓冲区)
    - -                                       -                |      - -                                 -
发表于 2022-01-28 16:29:08 回复(2)
如果printf(“_\n”)会直接输出6个,输出要是printf(“_”)不会立即输出,而是将“_”放到缓存区,而子进程会继承父进程的环境,输出为8个
发表于 2022-04-28 22:04:22 回复(0)
我佛了 相同题目两个不同答案 两个相同题都没有换行输出缓冲区!!一个答案6一个答案8???****
编辑于 2022-03-29 09:15:08 回复(0)

注意:

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

上述代码输出6个-

发表于 2018-03-23 13:24:45 回复(7)
答案为8,要考虑缓冲区是不是立即写出。
发表于 2020-09-09 14:09:41 回复(0)
答案应该是8,我用编译器试过了
发表于 2023-01-11 17:08:03 回复(0)
答案错误,应该是8个,因为缓冲区不被父子进程共享,所以也会被复制。
发表于 2022-05-24 21:32:08 回复(1)
答案错的,应该为6个,第一次fork()为2,第二次是在原2的基础上复制,也就是4,最后2+4=6个

编辑于 2021-03-05 20:28:48 回复(2)
正确答案为8,大伙可以屏蔽此题
编辑于 2024-01-07 21:20:52 回复(0)
在Linux里运行了,这题确实是8,题目答案错了
发表于 2022-09-16 11:26:28 回复(0)
实践出真知,8个“-”
发表于 2022-09-03 14:38:07 回复(0)
....,算成子进程的个数。。。第一次是2^1 第二次为2^2 相加为打印的个数。。。

发表于 2022-08-05 08:53:35 回复(0)
答案有误。该题中printf打印时放在了缓冲区,子进程会同样复制一份,经过两次循环后,应该是8(1+1+1+1+2+2)。若printf中带有\n,则输出6(2+2)。
发表于 2022-08-02 17:46:51 回复(0)

我真的服牛客了,我刷一个月题了,这个题之前做过一模一样的,那个题答案是8正确,这个答案是6正确。
正确答案应该是8。
printf()是行缓冲的,遇到\n或者程序return之前,要打印的内容会暂存在缓冲区内,并不是直接显示在标准输出上。
因此第1次fork之后,两个进程的"-",都存在了各自的缓冲区中,没有直接输出到标准输出上
第2次fork的时候,新生成的两个子进程都会复制其父进程的缓冲区状态,因此,此时的4个进程缓冲区都已经有一个'-',然后再次printf('-'),于是一共 8 个'-'。
如果是printf("-\n")的话,每循环一次就会直接打印"-"到标准输出,就是2 + 4 = 6个。

编辑于 2023-12-06 20:38:53 回复(0)
我在Mac上测试输出6个,再WSL2上测试输出8个
发表于 2023-08-25 11:01:07 回复(0)
题目:请问下面的程序一共输出多少个“-”?

#include 

int main(void) 

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

return 0; 
}                    

解析:一共输出8个。
首先程序一开始,bash产生一个进程P1执行此程序,P1进入程序。
当i=0时:
fork()产生一个子进程P2,同时它自己输出一个'-'。P2继承P1的诸如环境变量,P2首现会输出一个'-'。
当i=1,会继续执行for循环---P2先fork()出一个子进程P3,同时再输出一个'-'。
P3进程为P2的子进程,它会复制其父进程P2的指令,变量值,程序调用栈,环境变量,缓冲区等,它会输出一个'-'。
此时P1进入程序后,当i=1时,fork()产生另一个它的子进程P4,同时输出一个'-'。P4同样会输出一个'-'。
我们正常分析觉得应该产生6个'-'。
这是因为printf(“-”);语句有buffer,所以,对于上述程序,printf(“-”);把“-”放到了缓存中,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。
因为这里P3会继承P2的缓冲区,其中有一个'-',所以P3会输出两个'-'。
因为P4为P1的一个子进程它会继承P1的缓冲区,其中有一个'-',所以P4会输出两个'-'。
若将程序改为:

#include 
       
int main(void)
{
    int i;
    for (i = 0; i<2; i++){
        fork();
        printf("-\n");
    }

    return 0;
}

则输出六个

编辑于 2023-06-19 06:03:37 回复(0)
 的确是 8 个,答案不对啊
发表于 2022-08-15 15:36:56 回复(0)
编辑于 2022-08-08 20:26:19 回复(1)