内部命令: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
2 消息队列
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){
}
先pipe再fork
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();
}