实验六 进程基础
项目 | 内容 |
---|---|
这个作业属于哪个课程 | <班级课程的主页链接 > |
这个作业的要求在哪里 | <作业要求链接接地址> |
学号-姓名 | 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指令查看共享库,操作结果如下图所示:
运行可运行文件操作结果如下图所示:
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