apue 2013-03-28

内部命令:cd exit (bash)  中的一个功能

外部命令:ls date  (有对应的二进制文件)

单独的二进制文件

Cd  /tmp  exit  fork()

Ls -l >a.c   exec()

 

 

外  if (cmd  >){

Cmd[]=NULL;  结束标志

Open(a.c);

Dup2(fd,1);

}

 

内   if (cd bash)  {

内部

Cd  chdir();

Exit;return;

Continue;

}

 

Ls -l  | grep  A   过滤

管道:前面命令的输出作为后面命令的输入  完善内部命令   ls *.a  通配符

通配符的支持  :  ls *.c   任意一个 ls  ?.c  一个

 

Ls [a-z].c  a.c b.c c.c d.c 

 

Apue  几部分

1,文件操作   所有文件

2,多进程进程间通讯    1, 传输数据 传整型,传字符串  2  传输非数据     并发情况

信号传不了数据

进程之间是相对独立的   进程4G空间

把数据放在第三方    把数据放在内核里          通过OS

因为内核可以看到每个进程的     函数是共用的  

 

1,管道   半双工   ->   <-    单向的      双工 <->   双向的

Pipe();系统调用  

      内核中创造管道,返回给主调函数.管道两端

Mkfifo();管道文件

Xsi_ipc   ansi;  popen() pclose

 

消息队列

  Xsi_ipc;消息分类,灵活

3共享内存,与信号量使用   两个while

  Mmap()  fd   +  /dev/zero

  父子进程,open进程间关系

4,socket  套接字(协议)  TCP/IP

Lo  :网卡   本地回环测试   最慢的

 

效率:管道   mkfifo简单    足够老

 

非数据 :1信号 告知  通知

1,信号  :kill(pid)    怎么知道对方的pid

      父子进程之间:父进程返回值  子进程pid

2,信号量 pv操作    -1  +1

Xsi_ipc

 

Pipe()固定的两端读写

Pipe()

Fork();     父子进程都知道管道两端

 

If(pid==0){

}

If(pid>0){

}

 

pipefork

 

Fork   pipe   没有关系

 

Pipe:唯一方话号中带数字的

 

两个数据一样      pipe

不一样            结构体

 

Fd[0]   读    fd[1]  写       类型是否相同

Int fds[2];

Ret = pipe(fds);    

Fds[0]   read

Fds[1]   write

 

Int fds[4];

Pipe(fds);  fds[0]=read  fds[1]=write

Pipe(fds+2)   fds[2]  read  fds[3]  write

 

Char buf[100]="0";

Pid=fork();    子进程继承父进程

If (pid==0){  //write

Close(fds[0]);   write(fds[1],"hello world",11);

}

 

If (pid>0){  //read

Close(fds[1]);   read(fds[0],buf,sizeof(buf));  

Printf ("from c : %s",buf);

}

 

练习:  ls -l   /lib  |  grep  libc   

               写   获取

进程1   execlp("ls","ls","-l","/lib",NULL);

进程2   execlp("grep","grep","libc",NULL);

 

进程1   向管道写

进程2   从管道读   终端1

使用dup2   >   实现重定向

 

 

Pipe();

Fork();

父子    每个execlp

Int fds[2],pipe=pipe(fds);  

 

Dup2(fds[1],1);     两个文件指向同一个文件

Dup2(fds[0],0);      

 

输入  ->  输出 ->  输入—>  输出

0         fds[1]    fds[0]     1

 

Ssh();远程登录    socket套接字

Ssh_client        ssh_server   

0,1,2    dup2

Mkfifo:手工创造管道文件       任意进程     本机

 

Mkfifo   pp    0        不占用磁盘空间      内核中占用

 

Vi  多个文件   -O

 

Fd=open("pp",O_RDONLY);

Ret=read(fd,buf,sizeof(buf));

Printf ("from fifo:%s\n",buf);

 

Fd=open("pp",O_WRONLY);

Write(fd,"hello world");

先运行    读    再运行     写

 

练习:进程1,每个1秒产生一个随机数.

进程2,输出奇数

进程3,输出偶数

进程4,输出质数(素数)

 

输出,升序输出

某一个输出时的个数达到20.,所有进程结束

 

分析

1,一个管道能否实现单向

  管道:单向  ,如果一个写端,多个读端

写端不能指定把数据发给谁

 

 

进程1   产生随机数    3,4,个管道

2,3,4while(1)

Close(fd),写端再写,给自己发,自己结束当前进程。

读进程返回值为0.

判断read返回值,下次再写时才执行    管道处理不了

2,如何结束,判断read的返回值   如果写端结束,read  返回值  == 0

3约定数据大小,   4,   4

Write(fd,&num,sizeof(4));   write(fd,&num,sizeof(4));    地址

Read(fd,buf,sizeof(4));     网络编程

Read(fd,)文件写管道不一样

字符串结构体   

1,方式,2,传什么,3,怎么结束

 

1

Fd1=open();

Fd2=open();

Fd3=open();

While(1){

Rand%100;

If()

Write();

Else if 

Write();

Else if()

Write();

}

 

2

Open(argv[2])

While(1){

Ret=read();

If (ret==0)

Break;

Mysort();

Qsort();

Show();

}

 

 

 

 

 

posted @ 2013-03-28 22:12  王井玉  阅读(220)  评论(0编辑  收藏  举报