课程名:操作系统原理及Linux应用
内容/作用:设计/实验/作业/练习
学习:基于Linux的进程的并发执行2
一、前言
- 理解并发进程的基本概念和执行特征
- 理解进程的资源继承和并发执行。
- 理解进程的资源竞争和互斥实现。
二、环境与设备
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<stdio.h>
#include<stdlib.h>
#include<unistd.h>
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<unistd.h>
#include<stdio.h>
int main()
{
int p;
p=fork();
if(p==0)
{
putchar('b');
}
else
{
p=fork();
if(p==0)
putchar('c');
else
putchar('a');
}
printf("\n");
return 0;
}
Fork3,c
#include<unistd.h。
#include<stdio.h>
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<unistd.h>
#include<stdio.h>
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只有当父进程执行时才会输出。