首页 > 试题广场 >

Linux中,执行下面代码将打印多少个 "-" ()

[单选题]
Linux中,执行下面代码将打印多少个 "-" ()
int main(void){
	int i;
	for(i=0;i<4;i++){
		fork();
		printf("-\n");
	}
	return 0;
}
  • 16
  • 30
  • 32
  • 15
2+4+8+16=30
发表于 2017-06-08 20:24:30 回复(0)
更多回答
****,只算了最后一次16个
发表于 2020-09-14 08:56:15 回复(0)
i=0时,主进程和其创建的子进程分别打印'-',  打印2个
i=1时,之前两个进程打印'-', 每个进程又创建新的子进程, 共打印4个'-'
i=2时,之前的四个进程分别打印'-', 并创建新的子进程, 故共打印8个'-'
i=3时,之前的8个进程分别打印'-', 并创建新的子进程,故共打印16个'-'
综上所述, 共打印2+4+8+16=30个
发表于 2015-08-15 17:18:08 回复(3)
fork的题可以按以下公式来算。

主进程1分为2,每个子进程1分为2,构成一个二叉树,树高等于循环的次数n。
最后一层是最后得到的子进程数,它是偶数,等于2^n,前面有一题,循环5次有32个进程。

本题是求fork了多少次,即二叉数的节点数,它等于2^(n+1)-1,注意第一次fork后就会打印2个模杠,实际上没有第0次。
所以是2^(n+1) - 1 -1当n=4时,得30.
发表于 2015-08-13 21:52:22 回复(4)
感觉这样看能简单点:
fork();        //执行后有2个进程
printf("-\n");  //打印2次
fork();        //2翻倍为4
printf("-\n");  //打印4次
fork();        //4翻倍为8
printf("-\n");  //打印8次
fork();        //8翻倍为16
printf("-\n");  //打印16次
2+4+8+16 = 30

编辑于 2015-08-20 12:19:07 回复(2)
fork()函数执行一次,创建一个新进程并且复制父进程数据到新进程,即创建父进程的一个副本,其中它的返回值为0表示新建子进程,大于0(子进程pid)表示父进程,小于0表示出错。
i=0时打印2个-
i=1时打印2*2个-
i=2时打印2*2*2个-
i=3时打印2*2*2*2个-
合计2+4+8+16=30个
发表于 2015-08-13 13:03:58 回复(0)
  fork(); printf("-\n");
每次调用fork()函数之后,父线程和创建出的子线程都是从fork()后开始执行,意味着父线程和子线程将分别执行一次printf。

所以  1次 fork()调用  
对应着 2次printf()调用 
对应着 创建1个子线程

i = 4时,一共创建了2^4-1个子线程,也就是有15次fork()调用, 所以调用了30次printf
编辑于 2015-09-21 13:01:17 回复(0)
2+4+8+16=30
发表于 2015-08-13 22:15:38 回复(0)
发表于 2019-12-28 15:50:46 回复(0)
fork()类型题:分别有
1.先 fork();,再 printf()不换行类型(存储到缓冲区),
2.先fork();再 printfIn()换行类型(直接输出)
3.先printf()不换行类型(存储到缓冲区),再 fork();
 4. printfIn()换行类型(直接输出),再fork(); 
说明:fork();子线程会复制父线程缓冲区的数据!!
发表于 2019-09-29 12:43:40 回复(0)
图文并茂的讲解:http://notes.maxwi.com/2016/08/17/linux-fork/
发表于 2016-08-17 20:04:32 回复(1)
我想说,我运行出来是64个求解答,答案不对,我的系统是ubuntu 14-04?
#include<stdio.h>
#include<unistd.h>
int main()
{
    int i;
    int j = 0;
    for(i=0; i<4; i++)
    {
        fork();
        printf("%d  ", j++);
    }
}
运行结果:a.out
0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3  0  1  2  3
由于ubuntu截图很糟,我保证数据完全正确
编辑于 2015-09-14 22:37:50 回复(4)
第一次:主线程产生一个新的线程,1->1,则现在有两个线程,打印2次
第二次:第一次的两个线程,2->2,则现在有四个线程,打印4次
第三次:第二次的四个线程,4->4,则现在有八个线程,打印8次
第四次:第三次的八个线程,8->8,则现在有十六个线程,打印16次
则2+4+8+16=30
发表于 2015-08-22 11:24:31 回复(0)
啥头像
问的是多少个"-"将被打印,看成有多少个进程了。。。
发表于 2015-08-13 13:31:44 回复(0)

让我们逐个分析每个进程的行为:

  • 初始状态下有一个进程(主进程)。
  • 第一次 fork() 调用会创建一个新的子进程。现在有两个进程。
  • 第二次 fork() 调用会在主进程和子进程中各创建一个新的子进程。现在有四个进程。
  • 第三次 fork() 调用会在上述四个进程中的每个进程中再创建一个新的子进程。现在有八个进程。
  • 第四次 fork() 调用会在上述八个进程中的每个进程中再创建一个新的子进程。现在有十六个进程。

因此,总共有 16 个进程(包括主进程)。

每个进程都会执行 printf("-\n") 语句,打印一个短横线和一个换行符。所以,每个进程会输出一个短横线和一个换行符,共计 2 * 16 = 32 个字符。

发表于 2023-11-01 11:26:08 回复(0)
子进程与父进程间的变量共享:
  1. 变量共享

    • 在 fork() 调用后,子进程会继承父进程的变量的值。如果在 fork() 调用前父进程设置了某个变量,那么子进程在继承时将得到相同的变量值。
  2. 地址空间独立

    • 尽管变量的值在父进程和子进程之间共享,但它们拥有独立的地址空间。这意味着如果一个进程修改了变量的值,它不会影响另一个进程的变量。
  3. 写时复制(Copy-On-Write)

    • 实际的变量共享是通过写时复制实现的。这意味着在父进程和子进程中,只有在其中一个尝试修改变量时,系统才会复制相应的页面,确保每个进程都有独立的内存副本。

编辑于 2024-01-14 20:38:46 回复(0)
我还转不过来弯
发表于 2022-07-31 22:04:11 回复(0)
i=0时,主进程和其创建的子进程分别打印'-',  打印2个
i=1时,之前两个进程打印'-', 每个进程又创建新的子进程, 共打印4个'-'
i=2时,之前的四个进程分别打印'-', 并创建新的子进程, 故共打印8个'-'
i=3时,之前的8个进程分别打印'-', 并创建新的子进程,故共打印16个'-'
综上所述, 共打印2+4+8+16=30个
 
每次调用fork()函数之后,父线程和创建出的子线程都是从fork()后开始执行,意味着父线程和子线程将分别执行一次printf。
 
所以  1次 fork()调用  
对应着 2次printf()调用 
对应着 创建1个子线程
 
i = 4时,一共创建了2^4-1个子线程,也就是有15次fork()调用, 所以调用了30次printf
发表于 2019-08-18 16:03:10 回复(0)

发表于 2019-01-12 11:56:01 回复(0)
1->2->4->8>16  2+4+8+16=30
发表于 2018-04-08 17:35:32 回复(0)