实验二:进程控制和系统调用
1.实验要求
//本程序达到所有要求
具体要求:
- 程序调用 fork 创建子进程 ;
- 子进程调用 execvp() 执行其他程序 ;
- 调用 exit 终止进程 ;
- 代码有注释,提交实验报告 。
进一步要求: - 使用 wait() 替代示例代码中的 sleep 系统调用 ;
- 使用 C 程序调用 execvp ;
- 将实验 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