首页 > 试题广场 >

在上下文及头文件均正常的情况下,字符串Hello会被输出几次

[单选题]
在上下文及头文件均正常的情况下,字符串"Hello"会被输出几次?
int main() {
 printf("Hello");
 fork();
 printf("Hello");
} 
  • 2
  • 3
  • 4
  • 6
分两点说吧:
1.fork()函数会把它所在语句以后的语句复制到一个子进程里,单独执行。
2.如果printf函数最后没有"\n",则输出缓冲区不会被立即清空,而fork函数会把输出缓冲区里的内容也都复制到子进程里。
所以,父进程和子进程各输出2个Hello,共4个。
如果第一个printf("Hello");写成printf("Hello\n");,则只会输出3个Hello,父进程2个,子进程1个。
发表于 2016-09-29 17:39:51 回复(21)
print输出字符串如果不是一"\n"为结尾的话,就不会马上输出,而是保存在缓存区中。fork函数在创建子进程的时候会复制缓存区的数据。
发表于 2015-06-30 09:55:35 回复(0)
选C,你可以看一下这篇文章-》http://coolshell.cn/articles/7965.html
编辑于 2015-04-13 19:32:38 回复(7)
感觉不是考fork  而是在考printf的buffer问题
发表于 2015-09-06 17:53:41 回复(0)
1.fork会将之后位置的语句复制到子进程中,单独执行。
2.因为第一个没有输出换行符。所以缓存区没有清空,fork会将缓存区也进行复制。
发表于 2017-08-07 16:08:49 回复(0)
开始父进程输出一个hello,因为没有\n,所以子进程复制一个hello,子进程调用一个printf输出hello,父进程再输出一个hello,总共4个。
发表于 2016-07-21 22:22:52 回复(0)
 用printf()输出时是先输出到缓冲区,然后再从缓冲区送到屏幕上。linux下缓冲区刷新到屏幕这一步一般可以通过一下方式触发:
1.使用fflush(stdout)强制刷新标准输出缓冲区。
2.缓冲区已满。
3.scanf()要在缓冲区里取数据时会先将缓冲区刷新。
4.\n进入缓冲区时。
5. 程序结束时。
发表于 2019-06-07 11:42:13 回复(0)
分两点说吧:
1.fork()函数会把它所在语句以后的语句复制到一个子进程里,单独执行。
2.如果printf函数最后没有"\n",则输出缓冲区不会被立即清空,而fork函数会把输出缓冲区里的内容也都复制到子进程里。
所以,父进程和子进程各输出2个Hello,共4个。
如果第一个printf("Hello");写成printf("Hello\n");,则只会输出3个Hello,父进程2个,子进程1个。
发表于 2018-01-30 22:37:42 回复(0)
讲真 GCC运行出来是3次
不知各位大虾实测结果如何?
发表于 2016-07-10 17:20:46 回复(1)
C:4次,Hello后面加\n就3次了
发表于 2015-04-13 18:54:15 回复(1)
开始父进程输出一个hello,因为没有\n,所以子进程复制一个hello,子进程调用一个printf输出hello,父进程再输出一个hello,总共4个。记录
发表于 2022-03-07 17:05:20 回复(0)
fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
发表于 2018-08-16 19:08:33 回复(0)
在window下没有一个函数可以实现UNIX下的fork()函数,其原因是历史造成的.
对于UNIX来说它一出生就是多用户的系统,所以它的所有进程都共有一个最
原始的父进程init.而windows生下来时是个单用户系统(DOS),不存在这样的
概念.所以fork这个函数是UNIX下特有的.
发表于 2017-07-05 09:23:15 回复(0)
在默认情况下,子进程会继承父进程的缓冲区。
这意味着,如果父进程在调用 `printf` 函数之后没有进行刷新操作(例如使用 `fflush` 或遇到换行符 `\n`),则在 `fork` 之后的子进程中仍然存在父进程的输出缓冲区内容。

在给定的代码中,由于 `printf("Hello");` 没有显式刷新输出缓冲区,因此在 `fork` 之后的子进程中仍然存在父进程的输出缓冲区内容。所以,"Hello" 字符串会被输出两次。注意,这取决于底层的操作系统和编译器实现方式。

如果你希望确保每个进程都能立即输出内容,可以使用 `fflush(stdout);` 在 `printf` 语句后显式刷新输出缓冲区,如下所示:
#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Hello");
    fflush(stdout); // 刷新输出缓冲区
    fork();
    printf("Hello");
    fflush(stdout); // 刷新输出缓冲区
    return 0;
}

通过在 `printf` 之后使用 `fflush(stdout);`,你可以确保在 `fork` 后的子进程中正确地输出字符串 "Hello"。
发表于 2023-09-12 20:07:00 回复(0)
fork()会将其后的命令放入一个子进程中运行。上一个语句中printf没有"\n",则该语句打印的内容存放在缓冲区中,也会被带到fork()产生的子进程中,也一共会打印4个
发表于 2021-12-27 13:34:31 回复(0)
子进程会复制父进程缓存区里的东西,如果有\n就不会复制了
发表于 2024-05-10 16:24:54 回复(0)
分两点说吧: 1.fork()函数会把它所在语句以后的语句复制到一个子进程里,单独执行。 2.如果printf函数最后没有"\n",则输出缓冲区不会被立即清空,而fork函数会把输出缓冲区里的内容也都复制到子进程里。 所以,父进程和子进程各输出2个Hello,共4个。 如果第一个printf("Hello");写成printf("Hello\n");,则只会输出3个Hello,父进程2个,子进程1个。
编辑于 2024-04-01 14:27:51 回复(0)
发表于 2023-08-10 21:24:33 回复(0)
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
    printf("Hello");
    fork();
    printf("Hello");
}
这样为什么还出错啊?

发表于 2023-04-12 17:33:19 回复(0)
如果printf函数最后没有"\n",则输出缓冲区不会被立即清空,而fork函数会把输出缓冲区里的内容也都复制到子进程里。
发表于 2022-09-22 14:17:51 回复(0)