例子一:
#include<stdio.h>
#include <sys/types.h> //pid_t类型定义
#include <unistd.h> //函数fork(),getpid()定义
void main ()
{
pid_t pid;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %d\n",getpid());
else
printf("i am the parent process, my process id is %d\n",getpid());
}
例子二:
#include<stdio.h>
#include <sys/types.h> //pid_t类型定义
#include <unistd.h> //函数fork(),getpid()定义
void main ()
{
pid_t pid,pid2;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %d\n",getpid());
else
printf("i am the parent process, my process id is %d\n",getpid());
pid2=fork();
if (pid2 < 0)
printf("error in fork!");
else if (pid2 == 0)
printf("i am the child process, my process id is %d\n",getpid());
else
printf("i am the parent process, my process id is %d\n",getpid());
}
输出:
I am the paraent process,my process is 2927
I am the paraent process,my process is 2927
I am the child process, my process id is 2928
I am the paraent process,my process is 2928
I am the child process, my process id is 2929
I am the child process, my process id is 2930
运行过程:
首先是“父进程27”开始执行,执行到pid,生成子进程pid,然后输出一次“27”,执行到pid2,生成子进程pid2,然后输出一次“27”;
然后开始从第一个fork()执行pid子进程,输出“子进程28”,然后执行到第二个fork(),生成子进程pid2,输出“父进程28”(即pid作为的父进程)。
然后开始从第二个fork()执行pid子进程的子进程,输出“子进程29”
然后开始从第二个fork()执行pid2子进程,输出“子进程30”
看这个程序的时候,头脑中必须首先了解一个概念:在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同,将要执行的下一条语句都是if(pid==0)……。
两个进程中,原先就存在的那个被称作“父进程”,新出现的那个被称作“子进程”。父子进程的区别除了进程标志符(process ID)不同外,变量pid的值也不相同,pid存放的是fork的返回值。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
- 在父进程中,fork返回新创建子进程的进程ID;
- 在子进程中,fork返回0;
- 如果出现错误,fork返回一个负值;