在linux中创建一个新进程的唯一方法是使用fork函数,fork()执行一次但有两个返回值。
在父进程中,返回值是子进程的进程号;在子进程中,返回值为0。因此可通过返回值来判断当前进程是父进程还是子进程。
使用fork函数得到的子进程是父进程的一个复制品,它从父进程处复制了整个进程的地址空间,包括进程上下文,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程优先级,进程组号,当前工作目录,根目录,资源限制,控制终端等。而子进程所独有的只是它的进程号,资源使用和计时器等。可以看出,使用fork函数的代价是很大的,它复制了父进程中的代码段,数据段和堆栈段里的大部分内容,使得fork函数的执行速度并不快。
头文件:
#include <unistd.h>
函数定义:
int fork( void );
返回值:
子进程中返回0,父进程中返回子进程ID,出错返回-1
一个简单的fork程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t id; //定义一个进程号变量
int i=0;
printf("start fork/n");
id = fork(); //调用fork函数新建一个进程
i ++;
printf("end fork/n");
//判断当前进程
if(id < 0){ //出错
perror("fork failed/n");
exit(1);
}
else if(id == 0){ //子进程
printf("In child/n");
printf("i =