精华内容
下载资源
问答
  • 管道

    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手册

    展开全文
  • 1.进程间通信 2. 管道 2.2 匿名管道 2.3 命名管道(FIFO) 2.4 匿名/命名管道的区别

    1.进程间通信

    1.1 进程间通讯概述

    • 进程是一个独立的资源分配单元,不同进程之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源。进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信
    • 每个进程各自有不同的进程地址空间,所有进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区读走数据,内核提供的这种机制就是进程间通信(IPC),管道是最基本的IPC机制。

    1.2 进程间通信目的

    • 数据传输:一个进程需要将它的数据发送给另一个进程
    • 资源共享:多个进程之间共享同样的资源。
    • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
    • 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

    1.3 进程间通信分类

    管道

    1. 匿名管道
    2. 命名管道

    System V IPC

    1. System V 消息队列
    2. System V 共享内存
    3. System V 信号量

    POSIX IPC

    1. 消息队列
    2. 共享内存
    3. 信号量
    4. 互斥量
    5. 条件变量
    6. 读写锁

    2. 管道

    2.1 概述

    • 所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,就像现实中的水管,水就像数据。(连接进程,相当于在进程间连接一个通路,用来传递信息)
    • Linux下⼀切皆⽂件”,所以我们可以把管道看做是文件,是服务于管道通信的特殊文件,而管道通信是一种通信方式

    管道通信原理图:
    在这里插入图片描述

    2.2 匿名管道

    2.2.1 概述

    • 仅仅适用于具有亲缘关系(如父子进程)的进程间通信,因为匿名管道无法被其他进程找到,也就无法通信,所以只能通过子进程复制父进程的方法,让子进程能够访问到相同的管道来实现通信。

    2.2.2 创建匿名管道

    #include <unistd.h>
     
    int pipe(int fd[2])
    

    参数
    fd:文件描述符

    1. fd[0]:表示读端
    2. fd[1]:表示写端

    返回值
    成功返回0,失败返回错误代码。

    2.2.3 基本过程

    在这里插入图片描述

    2.2.4 内核角度了解实质

    • 在linux中,管道的实现并没有专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个file结构指向同一个临时的VFS索引节点,而这个索引节点又指向一个物理页面而实现。如下图所示:
      在这里插入图片描述

    2.2.5代码实现原理

    1. 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]、fd[1]指向管道的读端和写端
    2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道
    3. 父进程关闭管道写端,子进程关闭管道读端父进程可以从管道中读数据,子进程将从管道中写入数据。由于管道是利用环形队列实现的,数据从写端流入管道,从读端流出,这样就实现了进程间通信。

    2.2.6代码实现

    #include<stdio.h>
    #include<unistd.h>
    #include<string.h>
    
    #define SIZE 128
    int main()
    {
      int pipefd[2]={0};
      pipe(pipefd);
    
      pid_t id=fork();
      if(id==0)
      {
          close(pipefd[0]);
          const char* msg="Hello World!\n";
          while(1)
          {
          write(pipefd[1],msg,strlen(msg));
          sleep(1);
          }
      }
      else 
      {
          close(pipefd[1]);
          char buff[SIZE];
          while(1)
          {
           ssize_t s=read(pipefd[0],buff,sizeof(buff)-1);
           if(s>0)
           {
             buff[s]=0;
             printf("fathrt get message:%s\n",buff);
             sleep(1);
             }
          }
      }
      return 0;
    }
    

    运行结果:
    在这里插入图片描述

    2.2.7 常见读写行为

    • 使用管道需要注意以下4种特殊情况(假设都是阻塞I/O操作,没有设置O_NONBLOCK标志):
    1. 如果所有指向管道写端的文件描述符都关闭了(管道写端引用计数为0),而仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。

    2. 如果有指向管道写端的文件描述符没关闭(管道写端引用计数大于0),而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。

    3. 如果所有指向管道读端的文件描述符都关闭了(管道读端引用计数为0),这时有进程向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终止。当然也可以对SIGPIPE信号实施捕捉,不终止进程。具体方法信号章节详细介绍。

    4. 如果有指向管道读端的文件描述符没关闭(管道读端引用计数大于0),而持有管道读端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回。

    2.2.8 管道特点

    1. 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。
    2. 管道提供流式服务
    3. 一般而言,进程退出,管道释放,所以管道的生命周期随进程
    4. 一般而言,内核会对管道操作进行同步与互斥
    5. 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道

    2.3 命名管道(FIFO)

    2.3.1 概述

    • 命名管道在某种程度上可以看做是匿名管道 ,但他打破了匿名管道只能在有血缘关系的进程间的通信。命名管道之所以可以实现进程间通信在于通过同一个路径名而看到同一份资源,这份资源以FIFO的文件形式存在于文件系统中。
    • 它作为特殊的设备文件存在于文件系统中。因此,在进程中可以使用open()和close()函数打开和关闭命名管道

    2.3.2 创建命名管道

    程序里创建,相关函数:

    #include <sys/tyoes.h>
    #include <sys/stat.h>
    
    int mkfifo(const char* pathname, mode_t mode);
    

    参数:

    • pathname是一个文件的路径名,是创建的一个命名管道的文件名;
    • 参数mode是指文件的权限,文件权限取决于(mode&~umask)的值。

    返回值:

    • 返回值:若成功则返回0,否则返回-1

    2.3.3代码实现

    //server.c

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<string.h>
    #include<unistd.h>
    
    #define FIFO_FILE "./fifo"
    
    int main()
    {
      umask(0);
      if(mkfifo(FIFO_FILE ,0666)== -1)
      {
        perror("mkfifo error!\n");
        return 1;
      }
    
      int fd=open(FIFO_FILE,O_RDONLY);
      if(fd >=0)
      {
        char buf[64];
        while(1)
        {
          ssize_t s =  read(fd,buf,sizeof(buf)-1);
          if(s>0)
          {
            buf[s]=0;
            printf("client message is:%s",buf);
          }
          else if(s==0)
          {
            perror("client quit!\n");
            break;
          }
          else 
          {
            perror("read error!");
            break;
          }
        }
      }
      return 0;
    }
    
    

    // client.c

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    #define FIFO_FILE "./fifo"
    
    int main()
    {
    
      int fd=open(FIFO_FILE,O_WRONLY);
      if(fd >=0)
      {
        char buf[64];
        while(1)
        {
          printf("Please enter message:");
          fflush(stdout);
          ssize_t s=read(0,buf,sizeof(buf)-1);
          if(s>0)
         {
           buf[s]=0;
           write(fd,buf,s);
         }
        }
      }
      return 0;
    }
    
    

    运行结果:
    在这里插入图片描述

    2.3.4 运行总结

    1. 有运行结果可知实现了 client 和 server 之间的通信在client上输入的内容即在server上显示
    2. 且由图可得client和server之间是两个没有任何关系的进程,他们的pid 和 ppid都不相同
    3. 正是因为是两个不同的进程,所以才打破了匿名管道只有在具有亲缘关系间通信的束缚

    2.3.5 命令行创建命名管道

    命名管道可以从命令行上创建:

    $ mkfifo filename
    

    2.3.6 命令行命名管道通信

    在这里插入图片描述

    2.3.7 运行总结

    1. mkfifo 不仅是一个函数,还是一条命令,不仅可以在函数内创建管道,还可以在命令行上创建命名管道,实现两个命令进程之间的通信

    2.4 匿名/命名管道的区别

    1. 匿名管道由pipe函数创建并打开
    2. 命名管道由mkfifo函数创建打开用open
    3. FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

    进程间通信还有共享内存方式等,将在后序博客详解。

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

    虚拟机无端出现:

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

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

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

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

    重启解决

     


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

    千次阅读 2018-07-13 15:07:25
    进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种: 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。 流管道:去除了第一种限制,为半双工,可以双向传递, 命名管道:...
  • Linux进程通信——匿名管道、命名管道管道的特性一、管道1.1 什么是管道?1.2 匿名管道<1> 匿名管道参数说明<2> fork共享管道原理<3> 站在文件描述符角度-深度理解管道<4> 管道读写规则&...
  • 匿名管道和有名管道

    千次阅读 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 的文件形式存在于文件...
  • 分布式缓存Redis之Pipeline(管道

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

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

    2019-02-26 14:18:29
    管道(pipe)是进程用来通讯的共享内存区域。一个进程往管道中写入信息,而其它的进程可以从管道中读出信息。如其名,管道是进程间数据交流的通道。邮路(Mailslots)的功能与管道类似,也是进程间通讯...
  • linux管道pipe详解

    万次阅读 多人点赞 2018-08-24 17:58:04
    管道 管道的概念: 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个文件描述符引用...
  • Linux管道

    2018-06-01 21:46:08
    在Linux中,管道是一个比较重要的概念,进程间通信的一种方法,管道分为两种,一种是匿名管道,一种是命名管道。 匿名管道 匿名管道的本质是内核中提供的的一段内存。 匿名管道的的特性: 用于有亲缘关系的...
  • 管道通信的特点 1.管道通信是单向的,有固定的读端和写端。 2.数据被进程从管道读出后,在管道中该数据就不存在了 3.当进程去读取空管道的时候,进程会阻塞; 4.当管道往满管道写数据时,进程会阻塞; 5.管道的容量...
  • linux无名管道和有名管道

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

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

    千次阅读 2018-06-07 18:37:49
    管道实际上是一种固定大小的缓冲区,管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存中。它类似于通信中半双工信道的...
  • 【Linux】管道文件(有名管道、无名管道) 多进程编程的目的就是为了同时完成多个任务。 例如:一个产品,一个软件,需要n个进程同时执行才能完成,而这些进程之间一定是有所联系的。 因此:多进程工作时,进程间...
  • angular管道-number管道

    千次阅读 2018-11-12 21:03:24
    看例子: 2.1-4 的意思是:2表示数字的整数部分是两位,1-4表示数字的小数部分位数最少是一位,最多是4位,尽量往多的算。...要是pi的值取为3.1415926的话,那么被管道格式化后的值为:03.1416...
  • 管道(UNIX) 在类Unix计算机操作系统,一个管道是一个序列过程中通过其链接在一起的标准流,使每一个过程(输出标准输出)直接提供输入(标准输入)到下一个。 管线标准的shell语法是列出多个命令,以竖线(在...
  • redis管道

    千次阅读 2018-12-11 23:10:46
    所谓的redis的管道就是redis针对批处理数据的一种技术。 我们正常的操作是: 请求--网络IO--redis响应--网络IO--答复 通过管道pipLined后相当于跟redis服务端建立了一个通道,不是每个访问的数据都走上边的正常...
  • Linux 管道

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,383
精华内容 35,753
关键字:

管道