精华内容
参与话题
问答
  • 管道

    2012-03-27 00:32:39
    管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。  管道是指用于连接一...

       管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

       管道是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享方式,又称pipe文件。

     

    管道的特点:

    l 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;

    l 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);

    l 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

    l 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

     

    管道的创建:

    #include <unistd.h>

    int pipe(int fd[2])

    该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信。

     

    管道的读写规则:

     管道两端可分别用描述字fd[0]以及fd[1]来描述。

     管道的一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。

     如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。

    一般文件的I/O函数都可以用于管道,如closereadwrite等等。

    系统文件 write(fd[1],buf,size)

    功能:把buf中的长度为size字符的消息送入管道入口fd[1]

    fd[1]——pipe入口

    buf:存放消息的空间

    size:要写入的字符长度

    系统文件 read(fd[0],buf,size)

    功能:从pipe出口fd[0]读出size字符的消息置入buf中。

    fd[0]――pipe的出口

     

    例如:父进程fork一个子进程后,子进程把字符串写到管道中,父进程从管道中读取字符串

    展开全文
  • 之前已经写过了winodws命名管道相关的知识,在我的由psexec远控的实现原理到windows命名管道这篇文章中,最近复习的时候又看到了,同时对其有了新的理解,进而又想起了msf中getsystem的原理发现两者刚好有所关联,...

    1.前言

    之前已经写过了winodws命名管道相关的知识,在我的由psexec远控的实现原理到windows命名管道这篇文章中,最近复习的时候又看到了,同时对其有了新的理解,进而又想起了msf中getsystem的原理发现两者刚好有所关联,于是有了这篇文章。

    2.windows命名管道

    首先我们需要明确的一点,命名管道基于smb协议通信,smb,smb。重要的事情说三遍。
    它是用来让两个进程间进行通信的,这两个进程可以是本地进程,也可以是远程进程。命名管道有点类似于socket连接,是用来传输数据的,可以设置具体的权限让指定权限的进程才能连接命名管道,理论上每个程序都能连接命名管道,只是连接之后能做的事情不同,具体能做什么事跟服务端的配置有关系。
    下面总结几点:
    1.命名管道是C/S架构,必须让服务端某个进程先创建命名管道。
    2.命名管道可以被任何符合权限的进程去访问,且何种权限可以访问是可以自定义的。
    3.客户端可以是本地的某个进程或者远程的某个进程,本地进程访问命名管道方式为.\pipe\pipename,远程进程访问命名管道方法为\ip\pipe\pipename。
    4.在powershell中使用dir .\pipe\ | select name可以查看当前所有命名管道的名称。
    命名管道还有一个特点就是当服务端进程被客户端进程连接的时候,理论上说服务端进程有可能获取到客户端的权限。ImpersonateNamedPipeClient()这个api可以帮助我们进行实现,前提是我们当前用户具有SeImpersontePrivilege权限。

    3.msf中getsystem原理

    1.创建一个以system权限启动的程序,这个程序的作用是连接指定的命名管道。
    2.创建一个进程,并让进程创建命名管道。
    3.让之前的以system权限启动的程序启动并连接这个命名管道。
    4.利用ImpersonateNamedPipeClient()函数生成system权限的token。
    5.利用system权限的token启动cmd.exe。

    我们模拟一下这个过程:
    在一个拥有SeImpersonatePrivilege权限的用户(User组)启动一个进程,这个进程的作用是创建一个命名管道等待连接,连接成功后模拟客户端的权限,并用这个权限启动一个cmd窗口。

    1.查看当前用户权限:
    在这里插入图片描述
    在这里插入图片描述
    2.启动创建命名管道的脚本:
    脚本下载地址:pipeserverimpersonate
    在这里插入图片描述
    3.在administrator组用户的cmd中连接test1用户创建的命名管道:
    在这里插入图片描述
    4.弹出一个新的cmd窗口,查看权限发现是administrator用户的:
    在这里插入图片描述

    4.参考文章

    Windows Named Pipes & Impersonation
    msf手册

    展开全文
  • 未能将管道连接到虚拟机: 所有的管道范例都在使用中。 原因:Ubuntu开机慢到开不开,我就在任务管理器强制结束了进程,再次打开出现了这个问题 思考:杀掉进程的时候可能有些相关进程没有关掉,导致管道未释放 ...

    虚拟机无端出现:

    VMware Workstation 无法连接到虚拟机。请确保您有权限运行该程序、访问改程序使用的所有目录以及访问所有临时文件目录。未能将管道连接到虚拟机: 所有的管道范例都在使用中。

    原因:Ubuntu开机慢到开不开,我就在任务管理器强制结束了进程,再次打开出现了这个问题

    思考:杀掉进程的时候可能有些相关进程没有关掉,导致管道未释放

    解决办法:打开任务管理器,杀掉VMware 开头的任务

    重启解决

     


    展开全文
  • 命名管道和匿名管道

    千次阅读 2018-07-13 15:07:25
    进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种: 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。 流管道:去除了第一种限制,为半双工,可以双向传递, 命名管道:...

    我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。
    管道分为三种:

    • 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。
    • 流管道:去除了第一种限制,为半双工,可以双向传递,
    • 命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。

    1、普通管道
    int pipe(int fds[2]);//返回值0表示成功,-1表示失败

    fd[0]:读 fd[1]:写

    子进程往管道中写数据,写数据时要关闭读端
    父进程往管道中读数据,写数据时要关闭写端


    利用管道实现简单的操作,在管道中写入数据再读出:

    #include <stdio.h>
      2 #include <unistd.h>
      3 #include <string.h>
      4 #include <stdlib.h>
      5
      6 int main(void)
      7 {
      8     int fds[2];
      9     if(pipe(fds)==-1)
    10         perror("pipe"),exit(1);
    11     pid_t pid=fork();
    12     if(pid==-1) perror("fork"),exit(1);
    13
    14     if(pid==0){//子进程
    15         close(fds[0]);//关闭读端
    16         sleep(1);
    17         write(fds[1],"abj",3);//在写端上写入abj
    18         close(fds[1]);//再关闭写端
    19         exit(0);
    20     }else{//父进程
    21         close(fds[1]);//关闭写端
    22         char buf[100]={};
    23         int r=read(fds[0],buf,100);//将管道中的数据读到buf中,返回值是实际读取的字节数
    24         if(r==0)//读取的自己为0,代表读取文件结束
    25         printf("read EOF\n");
    26         else if(r==-1){
    27             perror("read"),exit(1);
    28         }
    29         else if(r>0)
    30             printf("buf=[%s]\n",buf);
    31         close(fds[0]);//读取成功,关闭读端
    32         exit(0);
    33     }
    34 }
    35


    2、匿名管道 :
    管道的创建

    管道文件大小为0,没有情缘关系的文件也能通过管道名,来取到该管道中的缓存。

    //创建管道文件
    int mkfifo(const char *name,mode_t mode)

    //打开管道文件
    int fd=open(name,O_RDONLY);读
    int fd=open(name,O_WRONLY);写

    //read/write,语义和匿名管道一样
    利用命名管道实现文件的复制,代码如下:
    1)、将文件写入命名管道中

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <fcntl.h>
    
    int main(char argc,char *argv[])
    {
            mkfifo("tp",0644);//创建一个命名管道
            int infd=open("abc",O_RDONLY);//表示要复制的文件
            if(infd<0)
                    perror("open"),exit(1);
            int outfd=open("tp",O_WRONLY);//写入到管道文件中
            if(outfd<0)
                    perror("open"),exit(1);
            char buf[100];
            int n=0;
            while((n=read(infd,buf,100))>0){
                    write(outfd,buf,n);//往outfd中写入数据
            }
            close(infd);
            close(outfd);
            return 0;
    }

    2)、将管道中的数据导入到拷贝文件中

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <string.h>
    
    int main(int argc,char *argv[])
    {
            int outfd=open("abc_bk",O_RDONLY|O_WRONLY|O_CREAT|O_TRUNC,0644);//需要拷贝的文件
            if(outfd<0)
                    perror("open"),exit(1);
            int infd=open("tp",O_RDONLY);//打开管道,将管道中的数据读走
            if(infd<0)
                    perror("open"),exit(1);
            char buf[100];
            int n;
            while((n=read(infd,buf,100))>0){
                    write(outfd,buf,n);
            }
            close(infd);
            close(outfd);
            unlink("tp");//删除指定名字的文件
            return 0;
    }

    3、匿名管道和命名管道的区别:

    匿名管道是由pipe函数创建 并打开的
    命名管道是由mkfifo函数创建 的 ,打开用open
    命名管道和匿名管道唯一的区别就是在创建的打开,一旦这些工作完成后,它们有相同的意义。

    展开全文
  • 分布式缓存Redis之Pipeline(管道

    万次阅读 多人点赞 2017-12-11 09:21:56
    写在前面  本学习教程所有示例代码见GitHub:https://github.com/selfconzrr/Redis_Learning  Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。...
  • 匿名管道和有名管道

    千次阅读 2018-07-08 17:27:20
    1. 管道的概念本质: 内核缓冲区  伪文件 - 不占用磁盘空间特点: 两部分: 读端,写端,对应两个文件描述符 数据写端流入, 读端流出 操作管道的进程被销毁之后,管道自动被释放了 管道读写两端默认是阻塞的 2....
  • 管道文件

    千次阅读 2019-11-12 17:55:25
    管道分为无名管道和有名管道两种管道管道文件是建立在内存之上可以同时被两个进程访问的文件。 先来说说有名管道: mkfifo函数创建有名管道,属于系统调用。 在linux操作系统中为实现下述功能, 先创建一个...
  • 管道——(1)有名管道和无名管道

    千次阅读 2017-11-18 18:27:26
    管道是用于“两个进程间的通信”的一种特殊的文件,它又分为有名管道和无名管道。 本文介绍了两种不同管道及其使用方法。
  • 有名管道

    2019-08-26 22:28:32
    无名管道只适用于有亲缘关系的进程间的通信,那么无亲缘关系的进程间如何通信呢?有名管道正是为了解决这个问题。有名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件...
  • 普通管道和命名管道

    2016-08-04 11:32:10
    普通管道只能用于父子进程或兄弟进程间的通信,因为普通管道通过fork调用来拷贝文件描述符的,在文件系统中,普通管道并不对应物理文件。 命名管道在文件系统中有物理文件存在,因此可以用于非亲属的进程间通信。 ...
  • 计算机管道

    2019-02-26 14:18:29
    管道(pipe)是进程用来通讯的共享内存区域。一个进程往管道中写入信息,而其它的进程可以从管道中读出信息。如其名,管道是进程间数据交流的通道。邮路(Mailslots)的功能与管道类似,也是进程间通讯...
  • 使用VMware fusion 安装虚拟机系统,一直显示“打不开 /dev/vmmon: 断裂管道 请确保已载入内核模块 ’vmmon’” 网上的命令试了一大堆,都不行,原来关键点在这,如下图所示: 打开 设置 -&amp;gt; 安全性与隐私...
  • linux管道pipe详解

    万次阅读 多人点赞 2018-08-24 17:58:04
    管道 管道的概念: 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个文件描述符引用...
  • 管道通信的特点 1.管道通信是单向的,有固定的读端和写端。 2.数据被进程从管道读出后,在管道中该数据就不存在了 3.当进程去读取空管道的时候,进程会阻塞; 4.当管道往满管道写数据时,进程会阻塞; 5.管道的容量...
  • Linux管道

    2018-06-01 21:46:08
    在Linux中,管道是一个比较重要的概念,进程间通信的一种方法,管道分为两种,一种是匿名管道,一种是命名管道。 匿名管道 匿名管道的本质是内核中提供的的一段内存。 匿名管道的的特性: 用于有亲缘关系的...
  • linux无名管道和有名管道

    千次阅读 2017-04-07 16:27:04
    1)无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。  单独构成一种独立的文件系统:管道对于管道两端的进程而...
  • 有名管道和无名管道

    2015-07-28 11:11:57
    管道: 1. 管道是Unix系统最古老的进程间通信方式,其实质是一个虚拟文件,是在内核中维护了一个消息队列。 2. 历史上的管道通常是指半双工管道,只允许数据单向流动。现代系统大都提供全双工管道,数据可以沿着管道...
  • 管道机制

    千次阅读 2018-06-07 18:37:49
    管道实际上是一种固定大小的缓冲区,管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存中。它类似于通信中半双工信道的...
  • angular管道-number管道

    千次阅读 2018-11-12 21:03:24
    看例子: 2.1-4 的意思是:2表示数字的整数部分是两位,1-4表示数字的小数部分位数最少是一位,最多是4位,尽量往多的算。...要是pi的值取为3.1415926的话,那么被管道格式化后的值为:03.1416...
  • 【Linux】管道文件(有名管道、无名管道) 多进程编程的目的就是为了同时完成多个任务。 例如:一个产品,一个软件,需要n个进程同时执行才能完成,而这些进程之间一定是有所联系的。 因此:多进程工作时,进程间...
  • Python管道

    千次阅读 2018-07-30 22:23:35
    通过管道操作,可以指定一个程序的输出为另一个程序的输入,即将一个程序的标准输出与另一个程序的标准输入相连,这种机制就称为管道。 通常,管道操作的预防格式如下: 程序1 | 程序2 | 程序3…… | 程序n 其...
  • redis管道

    千次阅读 2018-12-11 23:10:46
    所谓的redis的管道就是redis针对批处理数据的一种技术。 我们正常的操作是: 请求--网络IO--redis响应--网络IO--答复 通过管道pipLined后相当于跟redis服务端建立了一个通道,不是每个访问的数据都走上边的正常...
  • 管道:一种进程间通讯且是一种半双工的通讯方式,即在同一时间内只能由一方往管道发送或者接收数据 小绿和小红是一对让人羡慕的情侣,他们都住在河两边(别问为什么他们在河两边,因为我不想让他们在一起),然后小绿就...
  • 管道(UNIX) 在类Unix计算机操作系统,一个管道是一个序列过程中通过其链接在一起的标准流,使每一个过程(输出标准输出)直接提供输入(标准输入)到下一个。 管线标准的shell语法是列出多个命令,以竖线(在...
  • Linux 管道

    千次阅读 2018-04-19 00:16:04
    什么是管道管道是最基本的进程间通讯,它是半双工的通讯(数据流是定向的)。它创建于内存缓冲区中,用于连接一个写进程一个读进程,大小刚好为一个页(4KB)。一个进程把数据写入管道,由内核定向的流入另一个读进程...
  • 管道通信

    千次阅读 2018-08-08 20:33:47
    ①普通管道(PIPE):通常有两种限制,一是单工,即只能单向传输;二是血缘,即常用于父子进程间(或有血缘关系的进程间)。 ②流管道(s_pipe):去除了上述的第一种限制,实现了双向传输。 ③命名管道(name_...

空空如也

1 2 3 4 5 ... 20
收藏数 75,100
精华内容 30,040
关键字:

管道