实验六 进程基础

实验六 进程基础

项目内容
课程 <班级课程的主页链接 >
作业要求 作业要求链接接地址
学号-姓名 17043130-张智勇
作业学习目标 1、掌握Linux系统环境C语言编程概2、学习Linux系统进程概念

实验内容

  1. 静态链接库的创建与使用
    • 静态链接库就是二进制可执行文件的集合,所以先创建.o文件

    • 创建静态库,同查看其中内容,最后再和main.o文件一起链接成可执行文件

    • 相关c程序

     

    • 静态链接库相当于把.o文件合成一个模块,当需要被多次调用时,可以直接使用,不需要再次编译。但是当函数模块过多时,每次的调用都会造成不必要的函数被使用,这样会浪费资源。

  2. 共享库的创建与使用
    • 先创建目录构架,然后是共享库的创建

    • 使用共享库,和静态库的操作类似,但是需要加上路径,通过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份即可。

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

    • 利用生成的可执行文件copy将mycp.c复制出test,再使用diff命令查看两个文件有何不同

    • 也可以通过cat命令查看test的内容,结果与mycp.c的内容一致

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

    • 删除了flush(NULL);后运行结果为

    • 再删除 \n 后运行结果

    (在终端下面是行缓冲的模式,\n具有刷新流的作用。但是在文件中是全缓冲模式,\n此时不具有刷新流的作用,仅仅起到换行作用。所以在删除fflush(NULL);后的输出重定向到out文件下,只会有一次Begin的出现。)

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

    int i;
    pid_t pid;
    for (i = 0; i < 3; i++)
    pid = fork();
    • 因为没有exit(0);退出子进程,所以子进程会作为父进程继续复制产生子进程。一共会有8个子进程产生。

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

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

    • 然后用 fork 函数产生子进程调用 execvp 启动 ls

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

    • 另开一个终端用 ps 命令来查看僵尸进程信息

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

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

posted @ 2020-05-05 10:22  零初见  阅读(155)  评论(0)    收藏  举报