资源描述
实验2 进程相关的系统调用
实验目的
学习Linux中与进程控制相关的系统调用,加深对进程、进程树等概念的理解。
实验内容
1. 学习使用以下几类系统调用,进行编程练习
l 获取进程的信息,getpid(), getppid()
l 父子进程控制,fork(),wait()
2. 学习熟练地使用程序的编辑vi,编译gcc,运行
3. 学习熟练地使用ps命令观察进程的状态及其关系
4. 选做:使用联机手册man,查看上述系统调用的完整指南
实验步骤
l 完成以下4个实验样例程序的编辑、编译、运行和观察。
l 通过联机手册,深入学习相应的系统调用。
l 对4个样例程序进行自主改造和实验,或者构造新的程序进行实验。
(1) 程序getpid.c
1. 输入程序 vi getpid.c
2. 编译连接 gcc getpid.c –o getpid
3. 后台运行 ./getpid &
4. 使用 ps –l 查看进程状态,验证getpid()和getppid()系统调用,注意父子进程的关系。
5. (选做)使用 man 2 getpid命令,查看getpid()系统调用的联机手册。
(2)程序fork.c
1. 先考虑一下,程序的输出结果是什么。
2. 输入程序 vi fork.c
3. 编译连接 gcc fork.c –o fork
4. 运行 ./fork
注意观察程序的输出
5. 验证自己原先的想法是否正确,想一想为什么。
6. (推荐)使用man 2 fork命令,查看fork的联机手册。
(3)程序mfork.c
1. 先考虑一下,程序的输出结果是什么。
2. 输入程序 vi mfork.c
3. 编译连接 gcc mfork.c –o mfork
4. 运行 ./mfork
注意观察程序的输出
5. 每隔几秒到十秒钟,反复使用 ps -l 命令观察。想想为什么。
注意./mfork进程的父进程号为1号进程。为什么?
(4)程序fork_wait.c
1. 先考虑以下,程序的执行结果是什么。
2. 输入程序 vi fork_wait.c
3. 编译连接 gcc fork_wait.c –o fork_wait
4. 后台运行 ./fork_wait &
5. 反复使用ps –l命令查看运行情况,注意父子进程关系;
注意观察子进程退出,然后父进程退出的过程。
6. (选做)使用man命令查看系统调用wait()的联机手册。
6
1. 进程控制的系统调用
l fork系统调用创建新的子进程
格式: pid=int fork()
fork调用返回时,系统中已有两个用户级环境完全相同的进程存在,这两个
进程从fork调用中得到的返回值不同,其中子进程得到的返回值为零,父进程
得到的返回值是新创建子进程的进程标识号。
l exec系统调用
格式:(六种)
int execl(path,arg0,arg1,…,argn,(char *)0)
char *path, *arg0, *arg1, …, *argn ;
exec调用进程的正文段被指定的目标文件的正文段所覆盖,其属性的变化方
式与fork成功后从父进程那里继承属性的方式几乎是一样的。系统中绝大多数
命令都是通过exec来执行的,不但shell进程所创建的子进程使用它来执行用户
命令,shell进程本身和它的祖先进程也是用exec来启动执行的。
l exit 系统调用终止进程执行
格式:void exit(status)
int status ;
参数status是调用进程终止时传递给其父进程的值。如调用进程还有子进
程,则将其所有子进程的父进程改为1号进程。
l wait 系统调用等待子进程暂仃或终止
格式:int wait(stat_loc) int wait((int *)0)
int stat_loc ;
wait 调用将调用进程挂起,直到该进程收到一个被其捕获的信号或者它的任
何一个子进程暂仃或终止为止。如果wait 调用之前已有子进程暂仃或终止,则
该调用立即返回。
l lockf 锁定文件
格式:int lockf(fd,fuction,size)
int files, fuction; long size; fd – 锁定文件标识
function=0不锁定表示
=1锁定
=2测试和锁定
=3测试有否被锁定
size --锁定或解锁的字节数,0表示从文件的当前位置到文件尾。
展开阅读全文