进程的创建、执⾏和终⽌实验操作系统实验
进程的创建、执⾏和终⽌实验
⽬的:本实验的⽬的是通过使⽤Linux的系统调⽤fork()、exec()、exit()编写⼀个程序,加深理解进程的创建、执⾏和终⽌等内容。
内容:
(1)利⽤fork()函数创建两个⼦进程。让系统中的3个进程分别输出⼀个不同的字符。观察并记录屏幕上显⽰的结果,分析原因。
(2)利⽤fork()和execlp()函数实验⼀个shell的基本功能,如图所⽰。⽤户输⼊命令后,按下列步骤执⾏⽤户命令:
1:利⽤fork()函数创建⼀个⼦进程。
2:利⽤execlp()函数启动命令程序。
3:利⽤wait()函数使⽗进程和⼦进程同步。
第⼀题代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid_1 = fork();
pid_t pid_2 = fork();
if (pid_1 == 0)
{
printf("我是⼦进程⼀号\t进程号是:%d\n", getpid());
printf函数的执行顺序
exit(0);
}
if (pid_2 == 0)
{
printf("我是⼦进程⼆号\t进程号是:%d\n", getpid());
exit(0);
}
if (pid_1 != 0 && pid_2 != 0)
{
printf("我是⽗进程\t进程号是:%d\n", getpid());
}
}
运⾏结果:
第⼆题代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(void)
{
wait(0);
pid_t pid = fork();
if (pid == 0)
{
execlp("ls", "ls", "-al", "../../../../", NULL);
}
}
运⾏结果:
实验分析:
第⼀题中⽤了两次fork但是最后程序却运⾏了四次,很明显不是创建了两个⼦进程,⽽是创建了三个,在第⼀个fork()被调⽤时创建了⼀个⼦进程。这时程序有两个进程。⽽由于⽗进程和⼦进程共享代码段,新被创建的⼦进程再次执⾏了这两个fork(),所以实际上第⼀个fork()是被执⾏了两次的,因此⼀共有四个进程。⽽且经过多次运⾏并观察结果发现,这⼏个进程执⾏的顺序是不确定的,它们是并⾏执⾏的。
第⼆题中先⽤创建了⼀个⼦进程,⽤过execlp()命令启⽤shell的ls功能查看⽂件夹。与此同时主进程通过wait()函数等待⼦进程,⼦进程结束之后,程序退出。