实验一 进程控制
一、实验目的:
加深对进程概念的理解,明确进程和程序的区别;掌握Linux 操作系统的进程创建和终止操作,体会父进程和子进程的关系及进程状态的变化;进一步认识并发执行的实质,编写并发程序。
二、实验平台:
虚拟机:VMWare9以上
操作系统:Ubuntu12.04以上
编辑器:Gedit | Vim
编译器:Gcc
三、实验内容:
(1)编写一段程序,使用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示“身份信息”:父进程显示“Parent process! PID=xxx1 PPID=xxx2”;子进程显示“Childx process! PID=xxx PPID=xxx”。多运行几次,观察记录屏幕上的显示结果,并分析原因。
说明:
xxx1为进程号,用getpid()函数可获取进程号;
xxx2为父进程号,用getppid()函数可获取父进程号;
Childx 中x 为1和2,用来区别两个子进程;
wait()函数用来避免父进程在子进程终止之前终止。
程序源码:
#include
#include
#include
#define NUM 2
int main(void)
{
pid_t pid1,pid2;
if((pid1=fork())
printf("创建进程1失败");
}else{
if(pid1==0){
//子进程1执行
printf("Child1 process: ");
printf("PID=%d PPID=%d \n",getpid(),getppid());
sleep(2);
}else{
if((pid2=fork())
printf("创建进程2失败");
}else{
if(pid2==0){ //子进程2执行
printf("Child2 process: ");
printf("PID=%d PPID=%d \n",getpid(),getppid());
}
else{
//父进程执行
wait(); wait(); printf("Parent process: "); printf("PID=%d PPID=%d \n",getpid(),getppid()); exit(0); }
}
}
}
}
执行结果
whtcmiss@whtcmiss-VirtualBox:~/Desktop$ gcc test1.c -o test
whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test
Child2 process: PID=2527 PPID=2525
Child1 process: PID=2526 PPID=2525
Parent process: PID=2525 PPID=2127
whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test
Child2 process: PID=2530 PPID=2528
Child1 process: PID=2529 PPID=2528
Parent process: PID=2528 PPID=2127
whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test
Child2 process: PID=2533 PPID=2531
Child1 process: PID=2532 PPID=2531
Parent process: PID=2531 PPID=2127
实验结果分析:
第一次程序运行结果,两个子进程的PPID 都是2525,是由同一个进程创建。而父进程PID 是2525,父进程PPID 是2127,说明父进程也是一系统进程的子进程。
第二次程序运行结果,父进程PID 是2528,PPID 是2127,说明父进程是由同一进程创建的,父进程也是以子进程的方式存在,且进程ID 是逐渐递增的。
(2)fork()和exec()系列函数能同时运行多个程序,利用上述函数将下面单进程顺序执行的程序single.c 改造成可并发执行3个进程的程序multi_process.c;并用time 命令获取程序的执行时间,比较单进程和多进程运行时间,并分析原因。
//single.c
#include
#define NUM 5
int main(void)
{
void print_msg(char *m);
print_msg("Good ");
print_msg("Morning ");
print_msg("007\n"); //将007替换为本人学号
return 0;
}
void print_msg(char *m)
{
int i;
for(i = 0; i
printf("%s",m);
fflush(stdout);
sleep(1);
}
}
编译运行方法:
#gcc single.c –o single
#time ./single
单线程执行结果:
多线程代码:
#multi_process.c
#include
#include
#include
#define NUM 5
int main(void)
{
pid_t pid[3];
int i;
for(i=1;i
pid[i-1]=fork();
if(pid[i-1]==0||pid[i-1]==-1)
break;
}
if(pid[0]==0){
execl("print","print","Good",NULL);
}
else {
if(pid[1]==0){
execl("print","print","Hello",NULL);
}
else{
if(pid[2]==0){
execl("print","print","[1**********]3",NULL);
}
wait();
wait();
wait();
exit(0);
}
}
return 0;
}
实验分析:第二个实验结果,第二个程序的多线程因为是并发执行,而且是有三个线程,所以在时间上几乎是单线程的1/3,而且因为是并发的,所以打印结果是无序的。
实验总结
本次实验首先要明确进程和程序的区别,我通过在Linux 操作系统的进程创建和终止操作,运行父进程和子进程,查看运行结果和进程状态的变化。实验过程中也了解了父进程与子进程的运行过程及其机制。
实验一 进程控制
一、实验目的:
加深对进程概念的理解,明确进程和程序的区别;掌握Linux 操作系统的进程创建和终止操作,体会父进程和子进程的关系及进程状态的变化;进一步认识并发执行的实质,编写并发程序。
二、实验平台:
虚拟机:VMWare9以上
操作系统:Ubuntu12.04以上
编辑器:Gedit | Vim
编译器:Gcc
三、实验内容:
(1)编写一段程序,使用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示“身份信息”:父进程显示“Parent process! PID=xxx1 PPID=xxx2”;子进程显示“Childx process! PID=xxx PPID=xxx”。多运行几次,观察记录屏幕上的显示结果,并分析原因。
说明:
xxx1为进程号,用getpid()函数可获取进程号;
xxx2为父进程号,用getppid()函数可获取父进程号;
Childx 中x 为1和2,用来区别两个子进程;
wait()函数用来避免父进程在子进程终止之前终止。
程序源码:
#include
#include
#include
#define NUM 2
int main(void)
{
pid_t pid1,pid2;
if((pid1=fork())
printf("创建进程1失败");
}else{
if(pid1==0){
//子进程1执行
printf("Child1 process: ");
printf("PID=%d PPID=%d \n",getpid(),getppid());
sleep(2);
}else{
if((pid2=fork())
printf("创建进程2失败");
}else{
if(pid2==0){ //子进程2执行
printf("Child2 process: ");
printf("PID=%d PPID=%d \n",getpid(),getppid());
}
else{
//父进程执行
wait(); wait(); printf("Parent process: "); printf("PID=%d PPID=%d \n",getpid(),getppid()); exit(0); }
}
}
}
}
执行结果
whtcmiss@whtcmiss-VirtualBox:~/Desktop$ gcc test1.c -o test
whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test
Child2 process: PID=2527 PPID=2525
Child1 process: PID=2526 PPID=2525
Parent process: PID=2525 PPID=2127
whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test
Child2 process: PID=2530 PPID=2528
Child1 process: PID=2529 PPID=2528
Parent process: PID=2528 PPID=2127
whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test
Child2 process: PID=2533 PPID=2531
Child1 process: PID=2532 PPID=2531
Parent process: PID=2531 PPID=2127
实验结果分析:
第一次程序运行结果,两个子进程的PPID 都是2525,是由同一个进程创建。而父进程PID 是2525,父进程PPID 是2127,说明父进程也是一系统进程的子进程。
第二次程序运行结果,父进程PID 是2528,PPID 是2127,说明父进程是由同一进程创建的,父进程也是以子进程的方式存在,且进程ID 是逐渐递增的。
(2)fork()和exec()系列函数能同时运行多个程序,利用上述函数将下面单进程顺序执行的程序single.c 改造成可并发执行3个进程的程序multi_process.c;并用time 命令获取程序的执行时间,比较单进程和多进程运行时间,并分析原因。
//single.c
#include
#define NUM 5
int main(void)
{
void print_msg(char *m);
print_msg("Good ");
print_msg("Morning ");
print_msg("007\n"); //将007替换为本人学号
return 0;
}
void print_msg(char *m)
{
int i;
for(i = 0; i
printf("%s",m);
fflush(stdout);
sleep(1);
}
}
编译运行方法:
#gcc single.c –o single
#time ./single
单线程执行结果:
多线程代码:
#multi_process.c
#include
#include
#include
#define NUM 5
int main(void)
{
pid_t pid[3];
int i;
for(i=1;i
pid[i-1]=fork();
if(pid[i-1]==0||pid[i-1]==-1)
break;
}
if(pid[0]==0){
execl("print","print","Good",NULL);
}
else {
if(pid[1]==0){
execl("print","print","Hello",NULL);
}
else{
if(pid[2]==0){
execl("print","print","[1**********]3",NULL);
}
wait();
wait();
wait();
exit(0);
}
}
return 0;
}
实验分析:第二个实验结果,第二个程序的多线程因为是并发执行,而且是有三个线程,所以在时间上几乎是单线程的1/3,而且因为是并发的,所以打印结果是无序的。
实验总结
本次实验首先要明确进程和程序的区别,我通过在Linux 操作系统的进程创建和终止操作,运行父进程和子进程,查看运行结果和进程状态的变化。实验过程中也了解了父进程与子进程的运行过程及其机制。