Process实验
实验目的
- 熟悉 Linux 应用程序编程;
- 掌握 Linux 多进程程序编写。
实验设备
实 验 设 备 | 数 量 | 备 注 |
---|
感知 RF2-210 实验箱 | 1 | 运行 linux 程序 | 串口线 | 1 | 连接网关板 COM3 与 PC 串口 | PC 机 | 1 | 编译和下载程序 |
实验内容
创建一个新进程后,打印各自的 PID 和 PPID。父进程须对子进程退出状态进行检测和回收。
实验原理
? 进程是一个正在执行的程序实例,是 Linux 调度的基本单位。 ? 进程 ID ? 仅介绍最常用的进程 ID(Process ID,PID)和父进程 ID(Parent Process ID, PPID)。一个PID标识一个唯一的进程。一个进程创建的新进程称为子进程(child process),创建子进程的进程称为父进程(parent process)。 ? 相应的获取进程 ID 的函数: ? getpid(void) ? getppid(void) ? 进程的其它 ID 也都有相应的读取函数。 ? 创建进程 ? 在 Linux 中,使用 fork()函数创建子进程进程。函数原型: ? pid_t fork(void) ? 如果创建失败,返回-1;创建成功,则向父进程返回子进程的 PID,并向子进程返回 0。 ? 等待进程 ? 创建子进程后,为了出现避免出现僵死状态,父进程应该收集子进程的退出 状态,等待子进程终止。可使用 wait 系列函数实现。如果一个子进程已经死掉, 但依然保留在进程表中,则成为僵死进程,占用进程表。如果僵死进程过多,会 严重影响系统性能。下面介绍 waitpid()函数。 pid_t waitpid(pid_t pid, int *status, int options) ? pid 是等待进程的 PID。 ? status 保存子进程的状态。 ? -1:等待任何 PGID 等于 PID 的绝对值的子进程; ? 1 :等待任何子进程; ? 0 :等待任何 PGID 等于调用进程的子进程; ? >0 :等待 PID 等于 pid 的子进程。 ? options 规定 wait 调用的行为(可复选)。 ? WHOHANG:没有子进程退出时立即返回; ? WUNTRACED:为没有存在报告状态的进程返回。
实验步骤
1.进入虚拟机ubuntu系统下,打开终端调试软件进入“/opt/WXL/Basic”实验操作目录 ? 输入以下命令进入“/opt/WXL/Basic”目录
#cd /opt/WXL/Basic
2.编译实验代码 2.1 输入以下命令新建process文件夹
# mkdir process
2.2 进入process实验目录 ? 输入以下命令新建process.c文件并填写内容
# touch process.c
? 输入命令新建Makefile文件并填写内容
# touch Makefile
2.3 编译生成可执行文件 ? 输入命令如下进行编译
# make
? 编译完成后在/opt/WXL/Basic/process 目录下生成了可执行目标文件 process。 3.下载到目标板执行 ? 将生成的可执行文件“process”拷贝到Windows目录下,通过超级终端使用串口下载到感知RF2-210实验箱目标板上运行。 3.1拷贝可执行文件到Windows; 3.2通过超级终端发送文件到感知RF2-210; 3.3修改可执行文件的权限和执行 修改权限输入命令:
#chmod 775 process
3.4执行程序命令:
# ./process
附录
以下代码有问题 process.c文件
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
int val, stat;
pid_t child;
printf("\nTry to create new process.\n");
child = fork();
switch(child) {
case -1:
perror("fork.\n");
exit(EXIT_FAILURE);
case 0:
printf("This is child.\n");
printf("\tchild pid is %d\n", getpid());
printf("\tchild ppid is %d\n", getppid());
exit(EXIT_SUCCESS);
default:
waitpid(child, &stat, 0);
printf("This is parent.\n");
printf("\tparent pid is %d\n", getpid());
printf("\tparent ppid is %d\n", getppid());
printf("\tchild exited with %d\n", stat);
}
Makefile文件
EXEC = process
OBJS = process.o
SRC = process.c
CC = arm-linux-gcc
CFLAGS += -O2 -Wall
LDFLAGS +=
all:$(EXEC)
$(EXEC):$(OBJS)
$(CC) $(CFLAGS) -c $@ $(OBJS)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
@rm -vf $(EXEC) *.o*-
|