1.软件:虚拟机VMware
2.环境:Linux系统环境
1,下面这个C程序展示了UNIX系统中父进程创建子进程及各自分开活动的情况。
fork( )
创建一个新进程。
系统调用格式:
pid=fork( )
参数定义:
int fork( )
fork( )返回值意义如下:
0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。
>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。
-1:创建失败。
如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(parent process)的副本,称为子进程(child process)。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。
1,代码:
Fork1.c
#include
#include
#include
int main()
{pid_tfpid;int count=0;fpid=fork();if(fpid<0)printf("error in fork!");else if(fpid==0){printf("I am the child process,my process id is %d\n");printf("我是爹的儿子\n");count++;}else{printf("I am process,my process id is %d\n");printf("我是孩子他爹\n");count++;}printf("统计结果是:%d\n,count");return 0;}
Fork2.c
#include
#include
int main()
{int p;p=fork();if(p==0){putchar('b');}else{p=fork();if(p==0)putchar('c');elseputchar('a');}printf("\n");return 0;}
Fork3,c
#include
int main()
{int p;printf("This is parent(pid=%d) process \n",getpid());p=fork();if(p==0)printf("This id child1(pid=%d) process:b\n",getpid());else{p=fork();if(p==0)printf("This is child2(pid=%d) process :\n",getpid());}printf("\n");return 0;
}
Fork4.C
#include
#include
int main()
{int i;printf("I son/pa ppos pid fpid\n");for(i=o;i<2,i++){pid_tfpid=fork();if(fpid==0)printf("%d child %4d %4d %4d\n",i,getppid(),getpid(),fpid());else{printf("%d parent %4d %4d %4d\n",i,getppid(),getpid(),fpid());}return 0;}
}
1,printf某些内容时,操作系统仅仅是把该内容放到了缓冲队列里,并没有实际显示到屏幕上。因此fork 后,子进程得到这份拷贝。而当printf中含有\n时, printf将刷新,因此子进程无法得到这份拷贝,fork也就只输出一次了。因此程序输出结果不管是子进程还是父进程前面都带有,而程序B只有当父进程执行时才会输出。