实验2-1 进程相关的系统调用
一、实验目的
学习Linux中与进程控制相关的系统调用,加深对进程、进程树等概念的理解。
二、实验内容
1. 学习使用以下几类系统调用,进行编程练习
获取进程的信息,getpid(), getppid()
父子进程控制,fork(),wait()
2. 学习熟练地使用程序的编辑vi,编译gcc,运行
3. 学习熟练地使用ps命令观察进程的状态及其关系
4. 选做:使用联机手册man,查看上述系统调用的完整指南
三、实验步骤
完成以下3个实验样例程序的编辑、编译、运行和观察。
1 通过联机手册,深入学习相应的系统调用。
2 对3个样例程序进行自主改造和实验,或者构造新的程序进行实验。
(1) 程序getpid.c
#include <stdio.h>
main()
{
int pid;
pid = getpid();
printf("my pid is %d\n", pid);
pid = getppid();
printf("my parent’s pid is %d\n", pid);
sleep(40);
}
- 输入程序 vi getpid.c
2.编译连接 gcc getpid.c -o getpid
3.后台运行 ./getpid &
4.使用 ps –l 查看进程状态,验证getpid()和getppid()系统调用,注意父子进程的关系。
5. (选做)使用 man 2 getpid命令,查看getpid()系统调用的联机手册。
(2)程序fork.c
#include <stdio.h>
int z = 0;
main()
{
int pid = getpid();
if (pid = fork()) {
z = pid;
printf(“z1 = %d\n”, z);
} else {
z = pid;
printf(“z2 = %d\n”, z);
}
printf(“all done, pid = %d\n”, pid);
}
- 先考虑一下,程序的输出结果是什么。
随机输出一个pid 的序号
- 输入程序 vi fork.c
- 编译连接 gcc fork.c -o fork
2.运行 ./fork
3.注意观察程序的输出
验证自己原先的想法是否正确,想一想为什么。
4.(推荐)使用man 2 fork命令,查看fork的联机手册。
(3)程序mfork.c
#include <stdio.h>
main()
{
int i, pid;
for (i=0; i<10; i++) {
pid = fork();
if (pid == 0) {
printf("child %d starts running\n", i);
sleep(60+i*5); // every child sleeps for a different period
exit(0);
} else {
printf("parent: generate a new child with pid %d\n", pid);
sleep(1);
}
}
}
- 先考虑一下,程序的输出结果是什么。
从0到9 先输出parent: generate a new child with pid
后输出child starts running
2.输入程序 vi mfork.c
3.编译连接 gcc mfork.c -o mfork
4.运行 ./mfork
5.注意观察程序的输出
每隔几秒到十秒钟,反复使用 ps -l 命令观察。想想为什么。
注意./mfork进程的父进程号为1号进程。为什么?
父进程号为1的进程被销毁