fork()函数

这里只是对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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值