多进程阶段练习
1 myshell#ls
2 myshell#ls -l
3 myshell#ls -l -a /dev
4 myshell# ls -l 空格或\t
5 myshell# ls -l 错误处理
6 myshell # cd /tmp 内部命令 exit
7 myshell#ls -l > a.c
8myshell#ls -l | grep A
输出管道 输入
Shell 人机交互的工具 放到指针数组里 shell 接受命令 -> 解析
执行不会结束 while 死循环
接受指令 执行结果 char buf[1024];
While (1){
Printf ("myshell#");
Gets(buf); gets()可以有空格
Printf ("%s\n",buf); #ls 回车没有空格
}
Execlp(buf,buf,NULL);
Fork();创建子进程 两个进程执行不同的功能
Wait() 等待进程清理 简单的协调工作
int main()
{
Pid = fork();
If (pid>0){
Wait(NULL);
父进程
}
If (pid==0)
{
子进程
}
If (pid <0)
{
创建进程出错
}
}
清理工作 shell 回收 子进程结束有信号
Init
创建子进程做什么?
1,自已实现的功能 myls 自己写
2,执行现有的命令 ls 系统
Exec 成功从 ls main 函数执行 代码替换
While(1)
{
Printf ("hello world\n");
Execlp("ls","ls",NULL);
Printf ("HELLO WORLD\n");
}
成功大写的打印不出来
现有的命令替换当前进程
Ls 程序
Exec 重新加载ls 代码
执行别人写的命令
Exec:
Execl()
Execv
Execvp
Execle
Execve
1, execl()
1,命令的路径 which ls
"/bin/ls" 字符串
2 "ls" 名称
3 "-l" "-a" 参数
4 NULL 结束标志空指针
Execl("/bin/ls","ls","-l",NULL)
列出参数
2 char *cmd[]={"ls","-l","-a",NULL}
Execv()
1 在那 which ls
2 指针数组 cmd 区别 execl
"/bin/ls"
3 execlp ("/bin/ls","ls","-l","-a",NULL);
PATH:记录路径 有查找过程
Echo $PATH shell 也会查找
少了自己查找 cp a.out /bin.
4 execvp()
Char *cmd[]={};
Execvp("ls",cmd); cmd[0]