OS实验二:进程控制和系统调用

本文详细介绍了操作系统实验中的进程控制和系统调用,包括fork、execvp、exit、wait等关键函数的使用,以及它们与其他类似函数的区别。通过创建子进程、执行外部程序、等待子进程结束,展示了如何在C程序中实现这些操作。同时,讨论了exec族函数和三对系统调用函数的区别,如fork与vfork、exit与_exit、fork与clone的差异。

实验二:进程控制和系统调用

在这里插入图片描述

1.实验要求

//本程序达到所有要求

具体要求:

  1. 程序调用 fork 创建子进程 ;
  2. 子进程调用 execvp() 执行其他程序 ;
  3. 调用 exit 终止进程 ;
  4. 代码有注释,提交实验报告 。
    进一步要求:
  5. 使用 wait() 替代示例代码中的 sleep 系统调用 ;
  6. 使用 C 程序调用 execvp ;
  7. 将实验 1 与实验 2 结合:在子进程中使用 execvp 运行实验一脚本代码 。

2.设计思路

程序只有一个函数:主函数。
在主函数中:
调用一次 fork 函数创建子进程。根据 fork 函数返回的 pid,
用一个 if - else 条件判断语句来将父进程和子进程区别开。
创建的子进程( pid == 0 ):调用 execvp 执行实验 1 shell 脚本代码。
创建的父进程( pid >0 ):调用 wait 等待子进程结束,然后exit。

3.实验结果截图

1.在 shell 中编译并运行程序
2.输出结果:子进程结束后,程序 exit

4.实验中遇到问题及解决办法

1.如何使用 exec 族的其他函数执行实验 1 代码
查找资料后,决定使用 execvp 。
execve
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
①文件路径 ②传递参数给执行文件 ③传递环境变量给执行文件
执行成功函数无返回值,执行失败返回 -1 。
execvp
int execvp(const char *filename, char *const argv[ ]);
①文件路径 ②传递参数给执行文件
执行成功函数无返回值,执行失败返回 -1 。

2.wait 系统调用用法
pid_t wait (int * status);
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
如果在调用函数时子进程已经结束,则会立即返回子进程结束状态值。
函数返回值为子进程的 pid 或 -1 (错误),子进程的结束状态值会由参数status返回。
如果不在意结束状态值,则参数 status 可以设成NULL。

5.实验代码

详见文末。

6.exec库函数

// 在实验报告中给出 exec 族函数的定义与区别
语法:
所需头文件:#include <unistd.h>
函数说明:执行文件
函数原型:
int execl(const char *path, const char *arg, …)
int execv(const char *path, char *const argv[])
int execle(const char *path, const char *arg, …, char *c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值