fork函数的注意点

fork函数时unix下的以自身进程创建子进程的系统调用,一次调用两次返回,返回为0的是子进程,大于0的是父进程。

注意 在fork调用出,父进程的空间会被原模原样的复制到子进程中,包括指令,变量值,程序调用栈,缓冲区。

这里给一个例子
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

`int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf(“-“);
}

return 0;
}`
会输出几个-
不考虑缓冲区的话,我们一般考虑会有6个-,是哪6个,第一次到fork(),创建子进程,返回2个,父进程打印一次,子进程打印一次,之后父子进程进入循环,后遇到fork()之后分别创建子进程,并返回2次,这样就是4次,一共6次,但是由于子进程会将父进程的缓冲区中的内容也复制下来,而且printf是带缓冲区的,所以在进入循环后遇到fork后,创建的子进程中,都带有彼此父进程缓冲区的一个‘-’,所以真实打印了8个‘-’

说道缓冲区,我必须提一下unix系统字符设备和块设备,
字符设备是一次读取一个字符的设备一般没有缓冲区(串口,键盘), 块设备是一块一块进行字符的读取,一般有缓冲区(磁盘,内存,显示器。)

c程序遇到’\n’, 或者EOF,或者缓冲区满了,或者文件描述符关闭,主动flush,都会将数据刷出缓冲区。

c++中
endl操纵符(manipulator)写入endl的效果结束当前行,并将与设备相关联的缓冲区中的内容刷入相应设备。缓冲刷新操作保证到目前为止程序产生的输出都真正的写入输出流中,而不是仅停留在内存中等待写入流
cin会刷新cout,程序非正常结束也会刷新cout。

感觉自己没说明白,结合一个pstree来演示一下
这里写图片描述
修改代码如上

这里写图片描述
编译运行

这里写图片描述
打开另一个终端运行上述命令。

这样结合pstree你可以清晰看到有多少进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值