apue 2013-03-25

多进程阶段练习

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]

 

posted @ 2013-03-25 21:54  王井玉  阅读(189)  评论(0编辑  收藏  举报