Linux--面试题、fork、进程相关代码及命令(含解析)

有\n不带缓冲区:i<n,SUM(A)=2^1+...+2^n

无\n带缓冲区:

(1)第一题打印几个A?产生了几个进程?

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h>

int main() {
	int i = 0; for (; i < 2; i++) 
	{
		fork();
		printf("A\n");
	}
    exit(0);
}

62b78d6ee5f94ce5bd4958524a1ed0c3.png

9028cc5a2f504c4592b19cb77ba22f12.png

 四个进程六个A

 (2)打印几个A ? 

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
int main()
{
	int i = 0;
	for (; i < 2; i++)
	{ 
		fork();
		printf("A"); 
	}
	exit(0);
}

a6b9a4e2f2154ed78d8f2826dafb0452.png

去掉\n,有缓冲区,将缓冲区中的A也复制了。

8ccc2cb188c148b6ae64933c1fce8430.png

 

 (3)对比以下两个代码, 看看各自打印几个A ? (理解缓冲区)

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
int main() 
{ 
	printf("A\n");
	fork(); exit(0); 
}
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
int main() 
{ 
	printf("A");
	fork(); 
	exit(0);
}

有\n不带缓冲区:i<n,SUM(A)=2^1+...+2^n

无\n带缓冲区:

2e8049ba718c4025965e627a875f747b.jpeg

 

36a9771e97c64a7a9402b0016b1a521f.png

 a4c846486da843c691eb6335835d43e6.png

 缓冲区:printf:将内容先写到缓冲区中,缓冲区刷新到界面(屏幕)

(4)打印几个A ?

#include <stdio.h> 
#include <stdlib.h>
#include <unistd.h>
int main() 
{ 
	fork() || fork();
	printf("A\n"); 
	exit(0); 
}

683cb225fdef4dbe97c969bd67bab74c.png

前一个fork(执行打印A,复制出3,4个fork)的返回值为子进程PID>0,则不执行第二个fork

第三个fork=0(执行过了),执行第四个fork,打印A,出现5,6个fork

第五个fork=0(执行过了,复制第三个,同3),执行第六个fork,打印A(第四个执行过了,不再执行复制)

3bbff896e3ea4840be69be57b48ccee6.png

 

 (5)打印几个A ? 

#include <stdio.h>
#include <stdlib.h> 
#include <unistd.h> 
int main()
{ 
	fork() && fork();
	printf("A\n");
	exit(0); 
}

1847c7ceb6f74e8f8e92cadf91aea870.png

 c4f24940974c4d7d9d6f27a5c4dc20c4.png

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值