实验六 进程基础

实验六 进程基础

项目 内容
这个作业属于哪个课程 <班级课程的主页链接 >
这个作业的要求在哪里 <作业要求链接接地址>
学号-姓名 17043115-李映霁
作业学习目标 1.掌握Linux系统环境C语言编程概念
2.学习Linux系统进程概念

实验内容

1.请举例说明静态链接库的创建与使用。

(1)、静态库的创建

因为,创建静态连接库需要用到.o文件,因此我们先建立两个.c文件生成.o文件,其分别是add.c->add.o

sub.c->sub.o;结果如下图所示:

此时已经生成了静态库libbase.a,可以用ar -t查看库里面的内容,操作结果如下所示:

(2)、静态库的使用

因为建立的静态库是一个函数,所以需要建立一个主函数,使用静态库操作如下所示:

2.请举例说明共享库的创建与使用。

为了方便函数声明的管理,我们首先创建一个common.h文件,将我们平常所写的函数在这个文件中声明一下,然后在主函数文件中直接调用该文件即可,修改后的主函数和common.h文件源码如下所示

!!!注意下面2张图的区别,第一张图不可用#include<common.h>来包含头文件,改为#include "common.h"

查看一下未创建共享库之前的目录结构,如下图所示:

目录已做处理,步骤已省略

(1)、创建共享库

(2)、使用共享库

可以使用ldd指令查看共享库,操作结果如下图所示:

image-20200429182937254

运行可运行文件操作结果如下图所示:

3.编程实现一个简单文件复制命令。

创建一个copy.c文件,写入图片中代码

将其生成可运行文件,其操作与对比如下所示:

创建空文件test_1,利用生成的文本复制命令copy将copy.c中的内容复制到test_1中,操作结果如下所示:

4.使用fork创建一个子进程,进程创建成功后父子进程分别输出不同的内容。

创建文件fork1.c,然后输入下图所示代码:

编译fork1.c并且运行生成的文件,结果如下图所示:

还可以将进程输出重定向到其他文件中,在此处,我们把它重定向到src文件夹下的out文件中,结果如下所示

5.使用fork创建多个子进程。

创建文件fork2.c,然后输入下图所示代码:

编译fork2.c并且运行生成的文件,结果如下图所示:

发现代码有一个子进程输入在父进程后面,如果需要先输入子进程,最后输入父进程,只需要假如sleep函数,更改结果和更改后操作结果如图所示:

6.在 fork 之前以写的方式创建了一个文件 test.txt。然后 fork 出的子进程立即向文件中写入“world”,然后睡眠5秒。而父进程在 fork 后睡眠3秒后向 test.txt 写入 "hello",并关闭描述符。子进程恢复后,又向 test.txt 文件中写入 "lalala"后关闭描述符,结束。

创建文件forkwrite.c,然后输入下图所示代码:

编译forkwrite.c并且运行生成的文件,结果如下图所示:

7.分别在主函数中使用execvp启动ls命令以及使用fork函数产生子进程调用execvp启动ls

(1)、使用execvp启动ls命令

创建文件execls.c,然后输入下图所示代码:

编译execls.c并且运行生成的文件,结果如下图所示:

(2)、使用fork函数产生子进程调用execvp启动ls

创建文件forkandexec.c,然后输入下图所示代码:

编译forkandexec.c并且运行生成的文件,结果如下图所示:

8.创建5个僵尸进程,并在终端通过ps axf命令查看僵尸进程信息。

创建文件mywait.c,然后输入下图所示代码:

编译mywait.c并且运行生成的文件,结果如下图所示:

9.通过wait来清理僵尸进程。

创建文件wipeout.c,然后输入下图所示代码:

编译wipeout.c并且运行生成的文件,结果如下图所示:

10.父进程通过waitpid函数等待特定子进程结束,若该子进程不结束,父进程一直阻塞。

创建文件lastwaitpid.c,然后输入下图所示代码:

编译lastwaitpid.c并且运行生成的文件,结果如下图所示:

由结果知,当子进程不结束的时候,父进程就阻塞,但是当子进程结束后,父进程关注于自己的工作,即输出father do self

原文地址:https://www.cnblogs.com/liyingji/p/12806146.html