题目要求

  • 使用fork,exec,wait实现mybash
  • 写出伪代码,产品代码和测试代码
  • 发表知识理解,实现过程和问题解决的博客(包含代码托管链接)

学习fork,exec,wait

fork

  • man fork

fork 这个英文单词在英文里是"分叉"意思, fork() 这个函数作用也很符合这个意思. 它的作用是复制当前进程(包括进程在内存里的堆栈数据)为1个新的镜像. 然后这个新的镜像和旧的进程同时执行下去. 相当于本来1个进程, 遇到fork() 函数后就分叉成两个进程同时执行了. 而且这两个进程是互不影响

exec

  • man exec

虽然使用if 对 fork() 的返回值进行判断, 实现了子进程和 主进程在if判断的范围内执行了不同的代码, 但是一旦if执行完成, 他们还是会各自执行后面的代码.

通常这不是我们期望的, 我们更多时会希望子进程执行一段特别的代码后就让他结束, 后面的代码让主程序执行就行了.

这个实现起来很简单, 在子程序的if 条件内最后加上exit() 函数就ok了.

wait

  • man wait

主程序和子程序的执行次序是随机的, 但是实际情况下, 通常我们希望子进程执行后, 才继续执行主进程.

例如对于上面的fork_1()函数, 我想先输出子进程的8个 "This is child process" 然后再输出 8个 主进程"This is parent process", 改如何做?

wait()函数就提供了这个功能, 在if 条件内的 主进程呢部分内 加上wait() 函数, 就可以让主进程执行fork()函数时先hold 住, 等子进程退出后再执行, 通常会配合子进程的exit()函数一同使用.

写出伪代码,产品代码和测试代码

  • 产品代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h> #define MAX 10
#define EXIT_FLAG "quit"
#define CMD_BUFFER_SIZE 256 //命令缓冲区大小 int main(void)
{
char * argv[MAX];
char cmdBuffer[CMD_BUFFER_SIZE];
int pid;
int status;
int paraNum; //参数个数 while(1)
{
printf("mybash >");
fflush(stdout); //及时输出命令提示符
fgets(cmdBuffer, CMD_BUFFER_SIZE, stdin);
if(cmdBuffer[0] == '\n')
{
continue;
}
if(cmdBuffer[strlen(cmdBuffer)-1] == '\n')
{//去掉末尾回车符
cmdBuffer[strlen(cmdBuffer)-1] = 0;
}
if(!strcmp(cmdBuffer, EXIT_FLAG))
{
break;
} //分割参数
paraNum = 1;
argv[0] = strtok(cmdBuffer, " "); //空格进行分割
while( (paraNum < MAX) &&(argv[paraNum] = strtok(NULL, " ")) )
{
paraNum++;
}
//创建子进程以执行命令
pid = vfork();
if( pid == 0 )
{//子进程执行命令
execvp(argv[0], argv);
perror("execvp");
exit(EXIT_FAILURE);
}else if( pid < 0 )
{//错误
perror("vfork");
exit(EXIT_FAILURE);
}else
{
waitpid(pid, &status, 0); //等待子进程结束
}
}
return 0;
}

最新文章

  1. 自然语言20.1 WordNet介绍和使用 _
  2. [转]Putty中文乱码解决方法
  3. 6.python字符串-内置方法列举
  4. Math.sqrt
  5. openwrt network interface(openwrt中的网络接口)
  6. ibus用上搜狗拼音词库
  7. Python GUI - Tkinter tkMessageBox
  8. UVa 10170 - The Hotel with Infinite Rooms
  9. Docker(九):Docker容器卷插件
  10. 腾讯云服务器tomcat端口无法访问
  11. day4函数文件操作
  12. ubuntu如何安装或更换内核
  13. POI 导出
  14. PyCharm2017破解步骤
  15. Steering Behaviors
  16. C++之输出100-200内的素数
  17. flask报错No module named &#39;flask.ext&#39;
  18. HDU2102(KB2-I)
  19. ZOJ3768 Continuous Login 2017-04-14 12:47 45人阅读 评论(0) 收藏
  20. Linux 环境下svn 服务器搭建

热门文章

  1. python中的递归函数
  2. history对象的使用--JavaScript基础
  3. 「拆小鹤」使用 python 实现 QQ机器人服务。
  4. 【BZOJ3238】差异(后缀自动机)
  5. 【Luogu3398】仓鼠找sugar(树链剖分)
  6. CentOS 6.4 配置 Hadoop 2.6.5
  7. OV摄像头SCCB通信协议
  8. maven导入多模块项目
  9. 反射Reflection创建
  10. 关于“应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具”问题的解决方法