首页 > 试题广场 >

下面的程序执行输出几个hello?

[单选题]
下面的程序执行输出几个hello?
#include<stdio.h>
#include <unistd.h>
int main( ) {
    fork( );
    fork( );
    fork( );
    printf("hello\n");
    return 0;
}
  • 3
  • 4
  • 6
  • 8
D
fork(); //2个进程
fork(); //4个进程
fork(); //8个进程
printf(“hello\n”);


发表于 2015-09-14 11:01:08 回复(0)
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
    1)在父进程中,fork返回新创建子进程的进程ID;
    2)在子进程中,fork返回0;
    3)如果出现错误,fork返回一个负值;

类似题目:http://www.nowcoder.com/questionTerminal/1f6cc9c0ef354f86b1727c6c030a1a19
编辑于 2015-09-14 11:20:04 回复(3)
这个题目是这样的:
fork( );
fork( );
fork( );
三条创建子进程的语句,第一句fork()之后,就存在两个进程了,
两个进程继续往下执行,同理 第二个fork()之后,就存在2*2=4个进程了,
再继续往下,到第三个fork()之后,程序当中就已经存在2*4=8个进程了,每个进程输出一句hello

所以答案是D




发表于 2016-10-18 20:26:25 回复(0)
太极生两仪,两仪生四象,四象生八卦
发表于 2019-11-10 12:12:45 回复(1)
发表于 2021-11-11 09:43:12 回复(2)
fork();// 2 + 1 + 1
fork();// 1  +  1
fork();// 1 
printf();
主线程依次执行上面的代码时依次通过fork()启动线程,每一个fork()与原来的进程几乎相同,执行他之后的代码,所以,以主线程执行顺序为准的话,每个fork()执行之后的代码一直 到执行printf(),有不同的次数(中间又有fork()), 再加上主线程自己的一个(+1) 输出printf(),所以 共 2 + 1 + 1 + 1  +1 + 1 + 1=8 个

发表于 2015-10-06 11:42:46 回复(0)
D
fork(); //一个进程
fork(); //二个进程
fork(); //四个进程
printf(“hello\n”);//一个

1+2+4+1=8

发表于 2015-09-14 10:35:37 回复(2)
                                                                    fork();
                                                                 /              \
                                                    fork();                    fork();
                                                    fork();                    fork();
                                                       /  \                           /   \
                                            fork();      fork() ;          fork();    fork();
                                          /    \            /    \            /        \        /    \
                                    printf   printf                                                            =8个printf    
发表于 2018-03-09 20:33:07 回复(0)
fork( );函数调用一次返回两次!
发表于 2015-09-14 10:24:29 回复(2)
 1.一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。
然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
  2.在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork
返回的值来判断当前进程是子进程还是父进程。这两个进程执行没有固定的先后顺序,
哪个进程先执行要看系统的进程调度策略。
   
  3.还有人可能疑惑为什么不是从#include处开始复制代码的,这是因为fork是把进程当前的情况拷贝一份, 执行fork时,
进程已经执行完了前面的代码,fork只拷贝下一个要执行的代码到新的进程。

编辑于 2017-08-29 11:31:26 回复(0)
突然想起之前遇到过一个cout<<“hello world”<<endl; 那道题考的是endl清空缓冲区的知识
发表于 2018-11-07 22:40:25 回复(0)
fork函数后面的代码都会执行2遍
发表于 2022-09-07 10:27:04 回复(0)

1. 首先,程序从`main`函数开始执行。
2. 接下来,调用`fork()`函数创建一个子进程。现在有两个进程在运行:父进程和子进程。
3. 父进程和子进程都会继续执行,每个进程都会调用第二个`fork()`。这将创建两个新的子进程,一个是父进程的子进程,另一个是原始子进程的子进程。现在有四个进程在运行。
4. 每个进程都会调用第三个`fork()`。这将创建四个新的子进程,每个现有进程都有一个子进程。现在有八个进程在运行。
5. 每个进程都会执行`printf("hello\n")`,因此会打印出8次"hello"。

编辑于 2024-04-04 22:54:39 回复(0)
画个树状图
发表于 2023-01-11 17:19:45 回复(0)
完全二叉树来理解

发表于 2022-08-23 20:19:15 回复(0)
调用fork()的时候, 缓存区和后续的代码会变成两份
fork
fork
fork
第一次fork时,在一个线程的基础上,  后面有 2个 fork ==fork> 4个fork 即 (一列为一个线程)
fork fork
fork fork
第二次fork时, 在4个线程的基础上, 后面各有一个fork => 4 fork 即
fork fork fork fork
第三次fork时 ,后面的printf在各个线程中又分出两份, 变成8个printf: 
 printf printf    printf printf    printf printf    printf printf
发表于 2022-03-08 09:17:36 回复(0)
fork()使得进程数量翻倍
发表于 2022-03-04 10:23:03 回复(0)
从后往前数
发表于 2021-01-20 18:40:46 回复(0)
发表于 2020-12-19 20:36:03 回复(0)
中文双引号,程序报错
发表于 2020-08-19 11:12:41 回复(0)