这里只是对fork及其相关内容简单介绍
一.fork()函数的作用是创建进程,从下一条指令开始则是父子进程分叉执行了,其执行顺序是任意的,涉及到进程调度问题
二.fork()函数创建进程后,创建的子进程的程序代码和原进程(父进程)相同,程序的代码是共享的,且创建的子进程初始数据和原进程相同,本身就是复制于原进程,实际为了高效性,用到了写时复制(cope on write)来实现,资源开始时以只读共享,有一方修改的时候才会复制,子进程从fork()的下一条语句执行,但是执行到具体内容可以不同,只要在程序后面根据fork()的返回值判断而执行不同
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
int pid = fork();
if(pid < 0)
{
printf("fork failed!\n");
exit(1);
}
else if(pid == 0)
{
printf("this is parent process!\n");
}
else
{
printf("this is child process!\n");
}
return 0;
}
这里就根据fork()函数返回值的不同执行不同的程序段,返回-1是出错,返回0表示为子进程,返回正整数表示原进程,这个正整数为创建的子进程的pid,需要明白的是,这里并不是在原程序中返回2次结果,原程序在调用fork()函数,发生0x80中断,进行相应的系统调用,创建子进程,子进程相关数据,而原进程返回值是子进程的pid,子进程返回值是0,系统调用过程中,system_call将sys_fork的返回值被存储到寄存器eax中,返回到0x80中断(Linux2.6以前)处执行中断返回将寄存器eax中的内容返回,因为子进程的数据内容和父进程相同,所以子进程被调度时也是要从0x80中断后的中断返回代码返回到子进程,子进程在初始化TSS(任务任务状态段)的时候将eax设置为0,返回时也就是0,至于执行顺序,这里就是否发生处理机调度以及怎样调度的问题了
三.编程中遇到过的问题,因为标准输出为行缓冲,父进程在使用printf()语句时如果没有加\n或者fflush一般是不会输出,发现子进程有输出fork()之前的printf()中内容,这便是因为父进程没有输出而将输出内容存在缓冲区,减少io系统调用提高效率,创建子进程后被复制,对于行缓冲内容,一般4种情况输出:
1.主动使用fflush
2.有换行\n
3.缓冲满
4.程序结束系统fflush