模拟linux的shell---顺便复习一下fork,execlp和waitpid函数
2015-04-25 20:03
260 查看
我们知道, 如果在linux的shell中执行ls, 那么实际上shell对应的进程是父进程, ls对应的进程是子进程。 我们已经模拟过ls了, 下面, 我们来模拟一下shell, 让我们模拟的shell来执行linux的ls, pwd等命令, 模拟linux shell程序如下(也就是说, 下面程序就相当于一个shell):
结果如下:
[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进程。
#include <stdio.h> #include <sys/wait.h> #define MAX_LINE 10000 int 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进程。
相关文章推荐
- 上学时的sql项目(模拟ATM),今日复习顺便共享一下
- Linux--模拟实现一个shell
- linux用shell脚本模拟时钟 && 脚本录制
- 说一下linux中shell的后台进程与前台进程
- linux bash Shell脚本经典之Fork炸弹解析:() { :|:& };:
- Linux c进程管理—创建进程 system、execl、execlp、fork
- 模拟Linux的shell
- linux下使用系统调用模拟SHELL
- Linux下模拟多线程的并发并发shell脚本
- Linux的shell脚本LvsDR模式启动脚本和模拟keepalived高可用脚本
- 1.Linux复习 ---- fork的进一步理解
- Linux-shell基础复习笔记
- Linux下模拟多线程的并发shell脚本写法
- LINUX BASH SHELL,小小学习一下
- linux期末复习知识点小结(三)—— Shell
- linux基础,shell基础,复习sed的扩展
- Linux高级编程复习笔记 第五章 exec 进程 父子进程 fork()
- linux系统shell中调用另一个脚本的三种不同方法(source,exec,fork)
- Linux中模拟shell实现ls命令(不加参数)
- Linux中模拟shell实现mkdir命令