首页 > 试题广场 >

以下程序输出多少个“-”()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 回复(14)
直接上图:  输出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)
发表于 2024-08-22 22:03:23 回复(0)

分析:

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

// 父进程0
fork(); // 创建子进程1
printf("-"); // 无'\n'刷新缓冲,被子进程2继承
fork(); // 创建子进程2
printf("-");

// 子进程1
printf("-"); // 无'\n'刷新缓冲,被子进程1.1继承
fork(); // 创建子进程1.1
printf("-"); 

// 子进程2
printf("-");
printf("-"); // 继承父进程0的缓冲区

// 子进程1.1
printf("-");
printf("-"); // 继承父进程1.1的缓冲区
  • 对于父进程0,会执行2次for循环
  • 对于子进程1,会执行1.5次for循环(子进程不会执行fork()之前的代码)
  • 对于子进程2和子进程1.1,都只会执行0.5次for循环(即只执行for循环中的printf)
发表于 2024-08-05 19:02:42 回复(0)
正确答案为8,大伙可以屏蔽此题
编辑于 2024-01-07 21:20:52 回复(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)
在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)
for (i = 0; i < 2; i++) {
    fork();
    printf("-");
}
由于各个进程之间的行缓冲区互不影响,所以可以单个进程来分析。下面列举每个进程的执行过程:
------
主进程执行时间点:
   ① 判断 i(等于0) < 2,② 执行fork (假设进程名为M1),③ 打印"-" (此时主进程行缓冲区共1个"-")
   ④ 判断 i(等于1) < 2,  ⑤ 执行fork (假设进程名为M2),⑥ 打印"-" (此时主进程行缓冲区共2个"-")
------
M1进程执行时间点:
   (M1进程从主进程第②步开始分裂,复制了父进程的缓冲区,此时M1行缓冲区共0个"-")
                                                                                         ③ 打印"-" (此时M1行缓冲区共1个"-"),
   ④ 判断 i(等于1) < 2,  ⑤ 执行fork (假设进程名为M3),⑥ 打印"-" (此时M1行缓冲区共2个"-")
------
M2进程执行时间点:
   (M2进程从主进程第⑤步开始分裂,复制了父进程的缓冲区,此时M2行缓冲区共1个"-")
                                                                                         ⑥ 打印"-" (此时主进程行缓冲区共2个"-")
------
M3进程执行时间点:
   (M3进程从M1进程第⑤步开始分裂,复制了父进程的缓冲区,此时M3行缓冲区共1个"-")
                                                                                         ⑥ 打印"-" (此时主进程行缓冲区共2个"-")
------
每个进程的行缓冲区最终都有两个"-",一共有4个进程,所以最终会输出8个"-"
  
发表于 2025-07-03 21:30:39 回复(0)
fock创建子进程 1+2+3=6
编辑于 2025-03-09 11:59:25 回复(0)