实验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的进程被销毁
本文介绍了在Linux环境下学习和实践与进程相关的系统调用,如getpid(),getppid(),fork(),wait(),通过编写和运行示例程序,理解进程信息获取、父子进程控制以及使用工具如vi,gcc,ps和man进行操作和调试。
720

被折叠的 条评论
为什么被折叠?



