实验六 进程基础
| 项目 | 内容 |
|---|---|
| 课程 | <班级课程的主页链接 > |
| 作业要求 | 作业要求链接接地址 |
| 学号-姓名 | 17043130-张智勇 |
| 作业学习目标 | 1、掌握Linux系统环境C语言编程概2、学习Linux系统进程概念 |
实验内容
-
静态链接库的创建与使用
-
静态链接库就是二进制可执行文件的集合,所以先创建.o文件
![]()
-
创建静态库,同查看其中内容,最后再和main.o文件一起链接成可执行文件
![]()
-
相关c程序
![]()
![]()
![]()
-
静态链接库相当于把.o文件合成一个模块,当需要被多次调用时,可以直接使用,不需要再次编译。但是当函数模块过多时,每次的调用都会造成不必要的函数被使用,这样会浪费资源。
-
-
共享库的创建与使用
-
先创建目录构架,然后是共享库的创建
![]()
-
使用共享库,和静态库的操作类似,但是需要加上路径,通过ldd可以查看
![]()
![]()
-
相关c程序
// 文件名:common.h
#ifndef __COMMON__
#define __COMMON__
int add(int a, int b);
int sub(int a, int b);
#endif
// 文件名:add.c
int add(int a, int b) {
return a + b;
// 文件名:sub.c
int sub(int a, int b) {
return a - b;
}
// 文件名:main.c
#include <stdio.h>
#include "common.h"
int main() {
printf("3 + 1 = %d\n", add(3, 1));
printf("3 - 1 = %d\n", sub(3, 1));
}-
静态库被程序静态链接于编译时,而共享库被动态链接于运行时。共享库在程序运行时,会被加载到内存中任意地址处,此时,内存中就存在着该共享库的副本,所有引用该共享库的可执行文件都共享这个库,这样一来,原本需要在磁盘和内存中分别存在2份的模块如今只需在磁盘和内存中各存1份即可。
-
-
编程实现一个简单文件复制命令
![]()
![]()
-
利用生成的可执行文件copy将mycp.c复制出test,再使用diff命令查看两个文件有何不同
![]()
![]()
-
也可以通过cat命令查看test的内容,结果与mycp.c的内容一致
![]()
![]()
-
-
使用
fork创建一个子进程,进程创建成功后父子进程分别输出不同的内容![]()
![]()
-
删除了flush(NULL);后运行结果为
![]()
-
再删除 \n 后运行结果
![]()
(在终端下面是行缓冲的模式,\n具有刷新流的作用。但是在文件中是全缓冲模式,\n此时不具有刷新流的作用,仅仅起到换行作用。所以在删除fflush(NULL);后的输出重定向到out文件下,只会有一次Begin的出现。)
-
-
使用fork创建多个子进程
![]()
![]()
int i;
pid_t pid;
for (i = 0; i < 3; i++)
pid = fork();-
因为没有exit(0);退出子进程,所以子进程会作为父进程继续复制产生子进程。一共会有8个子进程产生。
-
-
在 fork 之前以写的方式创建了一个文件 test.txt。然后 fork 出的子进程立即向文件中写入“world”,然后睡眠5秒。而父进程在 fork 后睡眠3秒后向 test.txt 写入 "hello",并关闭描述符。子进程恢复后,又向 test.txt 文件中写入 "lalala"后关闭描述符,结束
![]()
![]()
-
分别在主函数中使用
execvp启动ls命令以及使用fork函数产生子进程调用execvp启动ls![]()
![]()
-
然后用 fork 函数产生子进程调用 execvp 启动 ls
![]()
![]()
-
-
创建5个僵尸进程,并在终端通过
ps axf命令查看僵尸进程信息![]()
-
另开一个终端用 ps 命令来查看僵尸进程信息
![]()
![]()
-
-
通过
wait来清理僵尸进程![]()
![]()
-
父进程通过
waitpid函数等待特定子进程结束,若该子进程不结束,父进程一直阻塞![]()
![]()


































浙公网安备 33010602011771号