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你可以清晰看到有多少进程。