目录
linux基本命令
类型:d目录 -普通 p管道
权限:r w x chomd
静态库libxx.a 共享库libxx.so
直接拷贝 使用时拷贝 -L路径 l库名
进程 复制进程fork exec替换 信号 SIGINT kill 9SIGCHLD
1、管道
管道可以用来在两个进程之间传递数据
ps-ef|grep “bash”
其中|就是管道。将ps命令的结果写入管道,然后grep再从管道中读出数据进行过滤
当管道为空时,读操作会阻塞,当管道写满后,写操作就会阻塞住。
2、有名管道
有名管道可以在任意两个进程直接通信
有名管道的创建:
命令创建 mkfifo FIFO
系统调用创建
int mkfifo(const char*filename,mode_t mode)//filename是管道名,mode是创建的文件的访问权限
成功返回0,失败返回-1
int main(){
//判断文件是否存在 int ret = open("fifo1", O_RDONLY);
if (ret == -1) {
printf("管道不存在,创建管道\n");
ret = mkfifo("fifo1", 0664);//创建管道
if (ret == -1) {
perror("mkfifo");
exit(0);
}
}
return 0;}
3、无名管道
无名管道主要应用于父子进程之间的通信
pipe()//成功返回0,失败返回-1
fd[0]是管道读端的描述符
fd[1]是管道写端的描述符
int main()
{
int fd[2];
int res=pipe(fd);//接收返回值,查看管道是否创建成功
asssert(res!=-1)//判断管道创建成功
pid_t pid=fork();//判断子进程是否创建成功
assert(pid!=-1)
if(pid=0)//表示当前在子进程中
{
char buff[128]={0};
read(fd[0],buff,127);//从管道向buff读入数据
printf(“%s”,buff);
}
else
{
write(fd[1],”hello”,5)//向管道读入数据
}
close(fd[0]);
close(fd[1]);
exit(0);
}
4、、无论是有名还是无名,写入管道的数据都写在内存中
管道是一种半双工通信方式(通信方式有单工、半双工通信、全双工通信)
单工通信:A只能发出B只能接收
半双工通信:A发送B接收或者A接收B发送
全双工通信:A发送并接受,B发送并接收
5、管道的实现
管道是一个固定大小的缓冲区 。在Linux 中,该缓冲区的 大小为1 页,即4KB,使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也 会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将 默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
从管道读数据是一个一次性操作,数据一旦被读走,那么他就从管道中被抛弃了,释放空间以便写入更多的数据
- 进程间通信(IPC):管道 信号量 共享内存 消息队列 套接字
- mkfifo FIFO
管道的大小永远为0,写到管道中的信息直接写到内存中了
如果在磁盘上性能比较低,临时通信时使用,至少一个读一个写
open write read close
对于管道的打开方式只有读或者只写
open(“文件名”,O_WRONLY)o-wronly
open("fifo",O_RDONLY);0_rdonly
如果管道文件只有读或者只有写,open的时候就会堵塞住,无法继续允许
管道的一段关闭,另外一端也会停止
写关闭,读也会关闭,返回值为0
6、有名管道和无名管道的区别
无名管道是在父子进程之间进行的,有名管道在任意两个管道之间都可以进行
7、写入管道的数据在哪里
内存
划分成一个一个字节头指针和尾指针之间的大小就是管道的大小,当头指针和尾指针指向同一个内存,表示数据被读空,读被堵塞,如果内存被写满了,那么写堵塞