计算机操作系统实验二进程管理

计算机操作系统实验二进程管理

实验目标

1、掌握getpid和getppid函数的使用
2、掌握fork函数的使用
3、理解exec函数族6个函数的区别,掌握6个函数的使用
4、理解exit和_exit的区别,掌握exit的使用
5、理解wait和waitpid的区别,掌握wait和waitpid的使用

实验内容

  1. 分别用execlp()、execl()和execv()函数实现命令“find / -name abc”的功能,将代码和执行结果粘贴到实验报告中。
  2. 编写多进程程序,掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤,要求:
    程序有3 个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -l”指令,另一个子进程在暂停5s 之后异常退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回;

实验步骤

1.分别用execlp()、execl()和execv()函数实现命令“find / -name abc”的功能,将代码和执行结果粘贴到实验报告中。

exec 函数族可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了
在进程中使用exec函数族的作用是使运行结果替换原有进程,所以为了避免父进程被替换掉,需要先在父进程中通过fork()函数创建子进程,然后在子进程中使用exec函数。在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,再利用exec系统调用将新产生的子进程完全替换成ps进程

  1. execlp函数
    【函数语法】
    execlp(file,arg1,arg2,……,NULL)
    execlp()会从PATH 环境变量(可通过env命令查看$PATH)所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
int main(){
	if (fork() == 0){
		if (execlp("find", "find", "/", "-name", "abc", "NULL") < 0){
			perror("Excelp error\n");
			}
	}
}
  1. execl函数
    【函数语法】
    execl()无法从PATH 环境变量所指的目录中查找符合参数file的文件名执行该文件。所以需要使用完整的文件目录来查找对应的可执行文件。注意目录必须以“/”开头,否则将被视为文件名
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
int main(){
	if (fork() == 0){
		if (execl("/bin/find", "find", "/", "-name", "abc", "NULL") < 0){
			perror("Execl error\n");
			}
	}
}
  1. execv函数
    【函数语法】
    通过构造指针数组的方式来传递参数,参数列表一定要以NULL 作为结尾标识符,execv()使用系统默认环境变量,不需要传递新环境变量。
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
int main(){
	char *arg[] = {"find", "/", "-name", "abc", "NULL"}
	if (fork() == 0){
		if (execv("/bin/find", arg) < 0)){
			perror("Execv error\n");
			}
	}
}
2.编写多进程程序,掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤,要求:

程序有3 个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -l”指令,另一个子进程在暂停5s 之后异常退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回;

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    pid_t pid1, pid2;
    int status1, status2;

    // 创建第一个子进程
    pid1 = fork();
    if (pid1 == -1) {
        perror("Error");
        exit(1);
    }

    if (pid1 == 0) { // 子进程1
        execlp("ls", "ls", "-l", NULL);
        perror("Exec failed");
        exit(1);
    } else { // 父进程
        // 阻塞等待第一个子进程结束
        wait(&status1);

        // 创建第二个子进程
        pid2 = fork();
        if (pid2 == -1) {
            perror("Error");
            exit(1);
        }

        if (pid2 == 0) { // 子进程2
            sleep(5); // 暂停5秒
            exit(2);
        } else { // 父进程
            // 非阻塞等待第二个子进程结束
            waitpid(pid2, &status2, WNOHANG);

            if (WIFEXITED(status2)) {
                printf("第二个子进程已结束,退出状态: %d\n", WEXITSTATUS(status2));
            }
        }
    }

    return 0;
}

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1.基本系统进程   Csrss.exe:这是子系统服务器进程,负责控制Windows创建或删除线程以及16位的虚拟DOS环境。   System Idle Process:这个进程是作为单线程运行在每个处理器上,并在系统不处理其它线程的时候分派处理器的时间。   Smss.exe:这是一个会话管理子系统,负责启动用户会话。   Services.exe:系统服务的管理工具。   Lsass.exe:本地的安全授权服务。   Explorer.exe:资源管理器。   Spoolsv.exe:管理缓冲区中的打印和传真作业。   Svchost.exe:这个进程要着重说明一下,有不少朋友都有这种错觉:若是在“任务管理器”中看到多个Svchost.exe在运行,就觉得是有病毒了。其实并不一定,系统启动的时候,Svchost.exe将检查注册表中的位置来创建需要加载的服务列表,如果多个Svchost.exe同时运行,则表明当前有多服务处于活动状态;多个DLL文件正在调用它。   至于其它一些附加进程,大多为系统服务,是可以酌情结束运行的。由于其数量众多,我们在此也不便于一一列举。   在系统资源紧张的情况下,我们可以选择结束一些附加进程,以增加资源,起到优化系统的作用。在排除基本系统及附加进程后,新增的陌生进程就值得被大家怀疑了。 更多内容请看Windows操作系统安装、系统优化大全、系统安全设置专题,或进入讨论讨论。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值