博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟linux的shell---顺便复习一下fork,execlp和waitpid函数
阅读量:4141 次
发布时间:2019-05-25

本文共 1222 字,大约阅读时间需要 4 分钟。

       我们知道, 如果在linux的shell中执行ls, 那么实际上shell对应的进程是父进程, ls对应的进程是子进程。 我们已经模拟过ls了, 下面, 我们来模拟一下shell, 让我们模拟的shell来执行linux的ls, pwd等命令, 模拟linux shell程序如下(也就是说, 下面程序就相当于一个shell):

 

#include 
#include
#define MAX_LINE 10000int main(){ int pid = 0; int status = 0; int len = 0; char buf[MAX_LINE] = {0}; printf("\n$$$"); while(fgets(buf, MAX_LINE, stdin) != NULL) { len = strlen(buf) - 1; if ('\n' == buf[len]) // 去掉尾部的换行符号 { buf[len] = '\0'; } pid = fork(); // fork一个子进程出来, 这个子进程主要用于拉起新的其他进程(比如ls进程, pwd进程等) if (pid < 0) { printf("error1\n"); return 1; } if (0 == pid) { // 子进程调用execlp来执行新的程序, 实际上就是拉起新的进程, 且最后一个参数必须为空指针 execlp(buf, buf, (char *)0); printf("error2\n"); // 如果用户输入的是abc这样不存在的命令, 则会走到这里 return 1; } if (waitpid(pid, &status,0) < 0) // 父进程阻塞地等待子进程执行完毕 { printf("error3\n"); return 1; } printf("\n$$$"); } return 0; }

 

 

 

      结果如下:

 

 

 

 

 [taoge@localhost learn_c]$ ls
a.out  test.c
[taoge@localhost learn_c]$ ./a.out 
$$$ls
a.out  test.c
$$$pwd
/home/taoge/Desktop/learn_c
$$$abc
error2
$$$ls
a.out  test.c
$$$

 

 

     可以看到, 我们自己写的shell通过fork来创建一个子进程, 然后这个子进程又拉起了一个新的ls进程, 而这个子进程和ls对应进程的进程号是相同的。

 

     实际上是linux自己shell进程拉起了我们自己写的shell进程, 然后我们的shell进程又拉起了ls进程。

 

 

转载地址:http://rugvi.baihongyu.com/

你可能感兴趣的文章
git命令速查表
查看>>
linux进程监控和自动重启的简单实现
查看>>
OpenFeign学习(三):OpenFeign配置生成代理对象
查看>>
OpenFeign学习(四):OpenFeign的方法同步请求执行
查看>>
OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
查看>>
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
苏宁产品经理面经
查看>>