Linux 编程基础 第三次作业

1.exec函数族和fork函数的区别

fork: 子进程复制父进程的堆栈段和数据段,子进程一旦开始运行,它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再影响

exec:一个进程调用exec类函数,它本身就"死亡"了,系统把代码段替换成新的程序代码,废弃原有数据段和堆栈段,并为新程序分配新数据段与堆栈段

exec 函数族中包含6个函数,分别为:

#Include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char * const argv[]);
int execvp(const char *file, char * const argv[]);
int execve(const char *path, char * const argv[], char * const envp[]);
————————————————

案例1代码:

1  #include <stdio.h>
     2  #include <stdlib.h>
     3  #include <unistd.h>
     4  int main()
     5  { pid_t tempPid;
     6    tempPid=fork();
     7    if(tempPid == -1){
     8          perror("fork error");
     9          exit(1);
    10    }else if(tempPid>0) {
    11          printf("parent process :pid=%d\n",getpid());
    12    } else {
    13          printf("child process : pid=%d\n"getpid());
    14          char *arg[]={"-a","-l","demo1.c",NULL};
    15          execvp("ls",arg);
    16          perror("error exec\n");
    17          printf("child process:pid=%d\n",getpid());
       
    18    }//of it
    19    return 0;
       
    20  }//of main

运行:
在这里插入图片描述
2.wait函数
#include<sys/wait.h>
pid_t wait(int *status);

案例2 若进程p1是其父进程p的先决进程,基于wait函数使得进程同步

#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
 
int main(){
    pid_t pid,w;
    pid = fork();
 
    if(pid == -1){
        perror("fork error");
        exit(1);
    }
    else if( pid == 0){
        sleep(3);
        printf("Child proccess: pid =%d\n",getpid());
        exit(5);
    }
    else if( pid > 0){
        int status;
        w = wait(&status);
        if(WIFEXITED(status)){
            printf("Child process pid = %d exit normally.\n",w);
            printf("Return Code:%d\n",WEXITSTATUS(status));
        }
        else{
            printf("Child process pid = %d exit abnormally.\n",w);
        }
    }
     return 0;
}

waitpid函数:
#include<sys/wait.h>
pid_t waitpid(pid_t pid int *status int options);

在这里插入图片描述

案例3代码

#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
 
 
int main(){
    pid_t pid,p,w;
    pid = fork();//创建第一个子进程
 
    if(pid == -1){//第一个子进程创建后父子进程的执行内容
        perror("fork error");
        exit(1);
    }
    else if(pid == 0){//子进程沉睡
        sleep(5);
        printf("First child process: pid =%d\n",getpid());
    }
    else if(pid > 0){//父进程继续创建进程
        int i;
        p = pid;
        for(i = 0; i<3 ; i++){//由父进程创建3个子进程
            if( (pid=fork()) == 0){
                break;
            }
        }
        if( pid == -1){//出错
            perror("fork error");
            exit(2);
        }
        else if(pid == 0){//子进程
            printf("Child process: pid =%d\n",getpid());
            exit(0);
        }
        else if(pid > 0){//父进程
            w =waitpid(p,NULL,0);//等待第一个子程序执行
            if(w == p){
                printf("Catch a child Process : pid = %d\n",w);
            }
            else{
                printf("waitpid error\n");
            }
        }
    }
    return 0;
}

在这里插入图片描述

特殊进程的危害

僵尸进程不能再次被运行,而且会占用一定的内存空间,并占据进程编号(id),当僵尸进程较多时,将会消耗系统内存,新进程可能因内存不足或无法获取pid而无法创建。

父进程通过 wait() 和 waitpid() 函数可以有效防止僵尸进程的产生,对于已存在的僵尸进程,则可通过杀死其父进程的方法解决。

当僵尸进程的父进程被终止后,僵尸进程将作为孤儿进程被 init 进程接收,init 进程会不断调用wait() 函数获取子进程状态,对已处于僵尸态的进程进行处理。

孤儿进程永远不会成为僵尸进程。

### 回答1: 北邮linux第三次上机作业是在系统管理课程中所进行的,主要涵盖了对Linux系统的进程管理、文件系统扩展、定时任务、用户和组管理等方面的学习。 在进程管理方面,我们主要掌握了如何使用ps命令、top命令和kill命令来查看、控制和关闭进程。在文件系统扩展方面,我们学习了如何使用LVM技术来管理硬盘的扩容和分区,以及如何使用fdisk命令来对磁盘进行分区管理。 此外,我们还掌握了如何使用crontab命令来进行定时任务的管理和设置,以及如何使用useradd命令和usermod命令来进行用户和组的管理和权限设置。这些技能对于如今的系统管理者而言是必须的。 在此次实验中,我们通过实际操作,更好地理解了Linux系统管理的机制和原理,掌握了课堂所学的知识点,并且对系统管理者所需要具备的能力进行了深入的思考和探讨。这些都是我们在今后的学习和工作中必不可少的技能。 ### 回答2: 北邮linux第三次上机作业是一项挑战性较高的任务,要求参与者具备一定的软件编程和计算机网络方面的知识。任务主要分为两个部分,第一部分是编写程序,第二部分是进行网络配置。 在编写程序的部分,参与者需要使用C或C++编写一个多线程的程序,并通过文件读取或用户输入来进行数据处理。该任务要求参与者能够熟练运用多线程的编程思想,以及能够对数据进行有效的处理和分析。此外,还要求程序能够稳定运行,并在遇到异常情况时给出正确的提示信息。 在网络配置的部分,参与者需要在Linux系统上配置一个网络服务,并对相应的服务进行测试。该任务要求参与者具备一定的计算机网络知识,能够熟练操作Linux系统,并能够利用相应的工具完成网络配置。此外,还要求参与者能够对配置的服务进行实际测试,并对测试结果进行分析。 总的来说,北邮linux第三次上机作业是一项涉及多个方面的任务,要求参与者具备综合的软件编程和计算机网络能力。完成该任务可以帮助参与者提高自己的技术水平,同时也有助于加强他们的团队沟通和协作能力。 ### 回答3: 北邮Linux第三次上机作业是一项关于Shell编程的实践任务,要求学生通过练习,掌握Shell脚本的基本语法和应用,加深理解Linux操作系统的特性和原理。该次实践作业旨在提高学生的实际操作能力,培养学生的团队精神和创新意识。 该作业的主要任务是实现一个小型的Shell应用程序,包括输入输出和文件操作、字符串操作和文件查找等多个功能。学生需要根据题目要求设计功能模块,编写Shell脚本程序,并进行测试和调试。实践过程中,要注意代码规范性和运行效率,以及对实验结果的记录和总结。 通过这次实践作业,学生可以更加深入地理解Shell编程语言,掌握Linux操作系统的基本操作和应用技巧,提高自己的逻辑思维和编程水平。同时,通过团队协作和分享经验,可以加强学生的交流和合作意识,培养创意和创业精神。 总之,北邮Linux第三次上机作业是一项富有挑战和创新性的实践任务,可以为学生打下深厚的理论和实践基础,提高学生的实际操作能力,激励学生的创新和创业精神,为未来的职业生涯做好充分准备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值