zoukankan      html  css  js  c++  java
  • 实验六 进程基础

    项目 内容
    这个作业属于哪个课程 班级课程
    这个作业的要求在哪里 作业要求
    学号-姓名 17041405-王煜
    作业学习目标 1.掌握Linux系统环境C语言编程概念;2.学习Linux系统进程概念.

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






    gcc *.c -c -I ../include             #将源文件编译成二进制文件,并且通过-I选项在头文件的搜索路径中添加指定目录
    ar rcs libtext.a *.o                 #实现二进制文件的打包
    nm libtext.a                         #查看静态库的内容
    

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


    cp 动态路径:

    export动态路径:

    (1)相对路径

    (2)绝对路径

    gcc *.c -c -fpic -I ../include      #-fpic作用于编译阶段,告诉编译器产生与位置无关代码,生成二进制目标文件
    gcc -shared *.o -o libtext.so       #lib为动态库命名前缀,.so为动态库命名后缀
    ldd calculate2                      #查看共享库
    export LD_LIBRARY_PATH=./lib1       #使用环境变量,在终端执行时,临时设置路径;将这条语句写入配置文件中,则永久有效
    

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



    open                             #打开或者创建一个文件或设备
    close                            #关闭一个文件描述符
    write                            #在一个文件描述符上执行写修改文件的操作
    read                             #在文件描述符上执行读操作
    lseek                            #修改文件的偏移量
    diff mycp.c test                 #找出两个文件的不同的,若一样则无输出
    

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


    (1)无fflush(NULL)语句且在终端上

    (2)有fflush(NULL)语句且在终端上

    (3)无fflush(NULL)语句且输出重定向到文件上

    (4)有fflush(NULL)语句且输出重定向到文件上

    (5)无fflush(NULL)语句且无 时,发现 只是实现换行操作

    文件默认为全缓冲模式,全缓冲模式下, 不会刷新缓冲区,而仅仅代表换行,所以BEGIN放在缓冲区中,还没来得及写到文件中,fork后父子进程的缓冲区都各自有一个BEGIN,所以会输出两次。因此在fork之前,要进行刷新流的操作。

    ./fork1 > /tmp/out            #将输出结果重定向到文件
    fflush(NULL)                  #刷新流
    

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

    int i;
    pid_t pid;
    for (i = 0; i < 3; i++) 
    pid = fork();
    #这段代码会产生1+2+4=7个子进程。
    


    getpid()                  #返回当前进程号
    getppid()                 #返回当前进程的父进程号
    

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



    sleep()         #挂起一段时间,单位内数字单位为s
    

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




    execvp(const char *file,char *const argv[])      #运行一个二进制的可执行文件,argv[]从argv[0]开始,argv才是真正意义上变参的实现
    

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



    ps -axf           #以树的方式查看进程数,可以查看僵尸进程的pid,名称和进程路径
    

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



    wait()                      #等待进程状态发生变化,若成功则返回终止的子进程的进程号,若失败则返回-1。可以只释放资源而不关心状态。
    

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



    waitpid()                      #用来等待某个特定进程的结束,且不用死等,有选项可供选择
    
  • 相关阅读:
    无约束优化算法——牛顿法与拟牛顿法(DFP,BFGS,LBFGS)
    撤销重做功能实现
    疯狂值班表(人员跟日期生成的视图)
    从零开始---控制台用c写俄罗斯方块游戏(2)
    unity3d关于碰撞问题
    主进程和服务进程通信调用Acrobat.AcroPDDoc时出现的问题
    echarts
    Wpf DataGrid动态添加列,行数据(二)
    Wpf DataGrid动态添加列,行数据(一)
    wpf学习资料链接(做记录)
  • 原文地址:https://www.cnblogs.com/Hailoooooo/p/12850738.html
Copyright © 2011-2022 走看看