首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

匿名管道:子进程被杀死时,父进程中的ReadFile会一直等待

匿名管道是一种用于进程间通信的机制,它允许一个进程将数据传输给另一个进程。在Windows操作系统中,匿名管道由一个读取端和一个写入端组成。

当父进程创建一个匿名管道后,它可以通过将写入端传递给子进程来实现进程间通信。子进程可以使用写入端将数据发送给父进程,而父进程可以使用读取端从管道中读取数据。

在这个问答中,当子进程被杀死时,父进程中的ReadFile会一直等待。这是因为ReadFile是一个阻塞操作,它会一直等待直到有数据可读取或者管道被关闭。

对于这种情况,可以通过设置管道的异步读取模式来避免父进程的ReadFile阻塞。通过使用异步I/O操作,父进程可以在等待数据时继续执行其他任务,而不会被阻塞。

腾讯云提供了一系列的云计算产品,其中包括云服务器、云数据库、云存储等。这些产品可以帮助开发者构建和管理云计算基础设施,并提供高可用性、弹性扩展和安全性等特性。

关于匿名管道的具体使用和相关产品,腾讯云提供了云原生容器服务(TKE)和云函数(SCF)等产品,可以帮助开发者在云上快速构建和部署应用程序,并实现进程间通信。您可以通过以下链接了解更多信息:

  1. 云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  2. 云函数(SCF):https://cloud.tencent.com/product/scf

请注意,以上链接仅供参考,具体的产品选择应根据实际需求和情况进行评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WindowsAPI 之 CreatePipe、CreateProcess

匿名管道主要用于本地父进程和子进程之间的通信,在父进程中的话,首先是要创建一个匿名管道,在创建匿名管道成功后,可以获取到对这个匿名管道的读写句柄,然后父进程就可以向这个匿名管道中写入数据和读取数据了,但是如果要实现的是父子进程通信的话...,那么还必须在父进程中创建一个子进程,同时,这个子进程必须能够继承和使用父进程的一些公开的句柄,因为在子进程中必须要使用父进程创建的匿名管道的读写句柄,通过这个匿名管道才能实现父子进程的通信,所以必须继承父进程的公开句柄...同时在创建子进程的时候,必须将子进程的标准输入句柄设置为父进程中创建匿名管道时得到的读管道句柄,将子进程的标准输出句柄设置为父进程中创建匿名管道时得到的写管道句柄。然后在子进程就可以读写匿名管道了。...匿名管道将在读、写句柄都被关闭后退出,也可以在进程中调用 CloseHandle()函数来关闭此句柄(个人理解就是,匿名管道,只能是你全部往管道中读写完之前,就不能干别的事,只能写或等待(管道满的时候处在等待状态...);而子进程在全部接收完管道的数据之前也只能读或等待(没数据时等待),也不能去干其它的事)。

4.2K10

CreatePipe、CreateProcess函数

匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。...第二:匿名管道只能实现父进程和子进程之间的通信,而不能实现任意两个本地进程之间的通信。...要从管道读取,一个进程在调用ReadFile函数时使用读取句柄。当以下任一条件为真时,ReadFile返回:写操作在管道的写入端完成,请求的字节数已被读取或发生错误。...当一个进程使用WriteFile写入匿名管道时,写操作在所有字节都被写入之前不会完成。...&dwRead, NULL))//这里是读管道,即便已经没有数据,仍然会等待接收数据,因为,子进程会认为父进程仍有数据要发送,只是暂时没法送, {

1.3K30
  • CreatePipe匿名管道通信

    在使用匿名管道通信时,服务器进程必须将其中的一个句柄传送给客户机进程。句柄的传递多通过继承来完成,服务器进程也允许这些句柄为子进程所继承。...当父进程向子进程发送数据时,用SetStdHandle()将管道的读句柄赋予标准输入句柄;在从子进程接收数据时,则用SetStdHandle()将管道的写句柄赋予标准输出(或标准错误)句柄。...如果父进程要发送数据到子进程,父进程可调用WriteFile()将数据写入到管道(传递管道写句柄给函数),子进程则调用GetStdHandle()取得管道的读句柄,将该句柄传入ReadFile()后从管道读取数据...在下面将要给出的程序示例中,将由父进程(管道服务器)创建一个子进程(管道客户机),子进程回见个其全部的标准输出发送到匿名管道中,父进程再从管道读取数据,一直到子进程关闭管道的写句柄。...在本示例中,将当前进程的标准输出设置为使用匿名管道,再创建子进程,子进程将继承父进程的标准输出,然后再将父进程的标准输出恢复为其初始状态。

    1.1K10

    【Linux课程学习】第十九弹---深入理解进程间通信---匿名管道,命名管道,多匿名管道的BUG

    文章会从进程间通信的介绍,匿名管道,命名管道,system V 共享内存讲解,system V可能会放在下面文章讲解。...因为他们要进行继承父进程的文件描述符,才能让他们看到同样的空间。 在Ubuntu系统中,管道的大小一般是64KB。...2.3匿名管道实现通信实现: 下面的代码实现的是,打开一个匿名管道。然后返回的是文件描述符。通过创建子进程,子进程继承父进程的文件描述符。这样就让父子进程看到同一个文件。...然后再去创建下一个匿名管道。 这个时候我们fork出来的子进程,还会继承父进程的一系列的文件描述符,其中就包括了指向上一个匿名管道的读端或者写端。所以我们要进行一一的关闭。...命名管道会有一个真实的文件在指定文件夹中。 命名管道其实就是一个文件,只是这个文件被OS经过特殊的处理,只占用内核的空间,不会去进行磁盘级的操作。

    8910

    进程间通信--管道

    1.在不关闭写端的情况下一直不向管道文件中写入,那么读端就会阻塞式读取(一定要读取到数据才会往下继续执行) 2.在不关闭读端的情况,一直向管道中写但不读取,文件的缓冲区满以后会一直等待读端来读取 3....4.基于匿名管道的简单进程池 设计一个由父进程负载均衡式的给子进程装载任务的简单进程池: 1.首先要让父进程创建一批管道和一批子进程,一个管道对应一个子进程 2.建立一批任务,将任务装载到一个函数指针数组中...return 0; } 写这样的代码很容易存在一个这样的问题: 因为子进程会拷贝父进程的文件描述符表,也就是说当父进程创建一个管道文件后,假设写端是3文件描述符,此时我再创建一个子进程,此时子进程的文件描述符表中的...3也会指向那个管道文件,也就说这个管道文件的写端被两个进程所指向了,当我关闭父进程的写端后,我所期望的是子进程读到0,然后退出;但是由于还有其他进程的指向这个管道文件,所以该子进程无法直接读到0,此时子进程就会阻塞式的等待读...因为进程具有独立性,所以在子进程中关闭并不会影响父进程。这样就又回到只有一个进程指向管道文件的写端,一个进程指向管道文件的读端,这时当我关闭父进程的写端时,子进程就可以通过读到0而退出了。

    21330

    管道(Pipe)createPipe

    匿名管道(Anonymous Pipes)是在父进程和子进程间单向数据传输的一种未命名的管道,仅仅能在本地计算机中使用,而不可用于网络间的通信。...假设父进程要发送数据到子进程,父进程可调用WriteFile()将数据写入到管道(传递管道写句柄给函数),子进程则调用GetStdHandle()取得管道的读句柄,将该句柄传入ReadFile()后从管道读取数据...假设是父进程从子进程读取数据,那么由子进程调用GetStdHandle()取得管道的写入句柄,并调用WriteFile()将数据写入到管道。...然后,父进程调用ReadFile()从管道读取出数据(传递管道读句柄给函数)。...匿名管道并不支持异步读、写操作,这也就意味着不能在匿名管道中使用ReadFileEx()和WriteFileEx(),并且ReadFile()和WriteFile()中的lpOverLapped參数也将被忽略

    1.3K10

    【操作系统】Windows进程间的通信

    进程是资源申请,高度和独立运行的单位,因此,它使用系统中的运行资源,而程序不能申请使用系统资源,不能被系统高度也不能作为独立运行的单位,因此它不占系统运行资源。...子进程 子进程还是一个进程,指的是由另一个进程(对应称之为父进程)所创建的进程。 单任务的同步机制——线程、子进程都可以实现。 需要保护地址空间。...子进程的线程既可以在父进程终止之后执行代码,也可以在父进程运行的过程中执行代码。...匿名管道是一个没有命名的单向管道,本质上就是一个共享的内存,抽象成是管道。...通常用来在父进程和子进程之间通信。只能实现本地两个进程之间的通信。不能实现网络通信。 优点是效率高,原理本质上就是共享内存。

    93440

    双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)

    大家好,又见面了,我是你们的朋友全栈君。 简介: 在本地,用父进程创建一个cmd.exe子进程,这个子进程的输入输出被重定向到两条匿名管道,从而实现与父进程通信。...父进程输入命令到一条管道,子进程读取后执行并输出到另一条管道,父进程读取后输出到窗口。...CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道,以改变DOS的标准输入输出 { return -1;...ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据 //如果读到数据,则对数据进行下一步处理...print(Buff); ZeroMemory(Buff,sizeof(Buff)); } else{ //管道中无数据时输入命令,以回车结束 char ch

    77621

    【Linux】进程间通信之匿名管道

    ,在进入管道前处理一次,在管道中的内容就是已经被处理过一次的内容,然后离开管道后再处理一次,得出的结果就是一个数据被前面的命令处理一次的结果被后面的命令处理 当时学习的时候只浮于表面,实际上管道就是起到一个传递数据流的作用...struct file,如果父进程fd==3以读方式打开管道文件,fd==4以写方式打开管道文件,那么子进程也一样,然后父进程close(3)子进程close(4)实现父写子读,父进程close(4)子进程...close(3)实现父读子写 因为一个文件是没法进行读写交替一起的,所以匿名管道其实是一种半双工的通信方式,即单向通信,当然我们可以通过建立多个匿名管道来实现双向通信 管道通信常用于父子进程通信,可用于兄弟进程...,没有出现子进程写一半父进程就读取的情况,所以父子进程直接是会进行协同的,有同步和互斥性 (一)管道中的四种情况 对管道中可能出现的四种情况做说明: 读写端正常,如果管道为空,读端就要被阻塞(上面印证...) 读写端正常,如果管道被写满,写端就要被阻塞(在管道特性这里印证) 读端正常,写端关闭,读端可以读到0,表明读到了文件结尾,不堵塞 写端正常,读端关闭,操作系统会杀死正在写入的进程,用信号SIGPIPE

    6510

    【Linux】Linux管道揭秘:匿名管道如何连接进程世界

    使用pepe()的基本流程: 创建管道:调用pipe()函数。 使用fork()创建一个子进程。 在父进程关闭写端,使用读端读取数据。 在子进程中关闭读端,使用写端将数据传输给父进程。...2.1.3 管道的4种情况与5种特性 4种情况: 管道内部没有数据时且子进程不关闭自己的写端文件fd,读端(父)就会堵塞等待,直到pipe有数据, 管道内部被写满且父进程(读端)不关闭自己的fd,写端写满后...读端不读且关闭,写再写,OS会直接终结写入的进程(子进程)通过信号13)SIGPIPE来杀死进程。 5种特性: 自带同步机制。 血缘关系进行通信,常见于父子进程。 pipe是面向字节流的。...2.1.4 匿名管道原理 通过父子进程继承关系,再将文件描述符关闭,实现一端写,一端读就是匿名管道. 创建匿名管道的步骤: 父进程以读写的方式打开,文件。...父进程fork创建子进程,子进程会拷贝一份PCB结构,PCB中会包含files_struct结构,files_struct中有一个指向struct file(文件)的指针数组,而文件描述符就是这个数组的下标

    10920

    1.6 编写双管道ShellCode

    在管道创建时,操作系统会为管道分配一段内存区域,该内存区域由创建管道的进程和与其通信的进程共享。当进程往管道中写入数据时,数据会被存储在管道的内存缓冲区中,然后等待另一个进程从管道中读取数据。...管道操作的标识符是HANDLE句柄,当管道被正确创建时则,我们可以直接使用ReadFile、WriteFile等文件读写函数来读写它,读者无需了解网络间进程间通信的细节部分; 一般匿名管道的创建需要调用...如果命名管道为空,则函数会阻塞等待数据到来,当接收到数据时则读者即可通过调用ReadFile在管道中读取数据,或调用WriteFile来向管道写入数据,至此关键的API函数已经介绍完了; 1.6.2 C...语言实现双管道后门 其实匿名管道反弹CMD的工作原理可以理解为,首先攻击机发命令并通过Socket传给目标机的父进程,目标机的父进程又通过一个匿名管道传给子进程,这里的子进程是cmd.exe,CMD执行命令后...,把结果通过另一个匿名管道返给父进程,父进程最后再通过Socket返回给攻击机,以此则实现了反弹Shell的目的; 接着我们就来实现这个双向匿名管道功能,在实现管道之前需要先建立套接字,首先使用WSAStartup

    18730

    1.6 编写双管道ShellCode后门

    在管道创建时,操作系统会为管道分配一段内存区域,该内存区域由创建管道的进程和与其通信的进程共享。当进程往管道中写入数据时,数据会被存储在管道的内存缓冲区中,然后等待另一个进程从管道中读取数据。...管道操作的标识符是HANDLE句柄,当管道被正确创建时则,我们可以直接使用ReadFile、WriteFile等文件读写函数来读写它,读者无需了解网络间进程间通信的细节部分; 一般匿名管道的创建需要调用...如果命名管道为空,则函数会阻塞等待数据到来,当接收到数据时则读者即可通过调用ReadFile在管道中读取数据,或调用WriteFile来向管道写入数据,至此关键的API函数已经介绍完了; 1.6.2 C...语言实现双管道后门 其实匿名管道反弹CMD的工作原理可以理解为,首先攻击机发命令并通过Socket传给目标机的父进程,目标机的父进程又通过一个匿名管道传给子进程,这里的子进程是cmd.exe,CMD执行命令后...,把结果通过另一个匿名管道返给父进程,父进程最后再通过Socket返回给攻击机,以此则实现了反弹Shell的目的; 接着我们就来实现这个双向匿名管道功能,在实现管道之前需要先建立套接字,首先使用WSAStartup

    17320

    进程间通信之CreatePipe

    若管道缓冲空间在写之前已经满了,那么WriteFile将一直不会返回直到ReadFile读管道后有足够的缓冲空间。 匿名管道是通过命名管道实现的。...因此,你可以把匿名管道handle作为命名管道handle使用。 为了释放管道使用的资源,应用程序应该关闭那些不再使用的handles。 下面是子进程的代码。...它使用继承的标准输入STDIN和输出STDOUT访问父进程创建的管道。 父进程从in.txt读数据,并把这些数据写到管道1中。子进程从管道1中通过STDIN获得数据,再通过STDOUT写到管道2中。...父进程之后再从管道2中读取数据并显示。...同时展示了如何通过匿名管道重定向子进程的标准输入和标准输出。 命名管道同样可以用于进程I/O的重定向。

    98310

    pipe和pipefd

    pipefd[1]:管道的写入端,通常用于向管道中写入数据。 在上述例子中,pipefd 被用作参数传递给 pipe 函数,并在子进程中用于读取数据,在父进程中用于写入数据。...sleep,父进程不sleep,父进程还是会跟着子进程sleep,因为父子进程是要协同的 管道本质 通信是为了更好的发送变化的数据,管道本质上是文件 所以必须要用到系统调用接口来访问管道,其是由系统管理...5:管道是基于文件的,而文件的生命周期是随进程的 再测试,把子进程sleep去掉,就是让子进程写快一点,父进程sleep几秒,就是让父进程读慢一点,看有什么现象  管道的四种情况 测试管道大小 把c一直往管道里写...0 读到结尾父进程也就可以停止读取了,break后去把僵尸的子进程回收 break到这里 最后子进程会被waitpid回收 测试子进程一直写,父进程读一会就退出 定义一个cnt控制退出的时间 这里也要修改一下...,父进程同理 子进程中的任务 子进程pid有了管道也有了,就差在父进程添加字段了 先更改一下,在class里构造一下 添加字段 测试一下:结果:文件描述符0,1,2是默认打开,3是从管道里读,4是写入管道

    9210

    【Linux】匿名管道实现简单进程池

    一、匿名管道通信的四种情况和五种特性 1.1、四种情况 管道内部没有数据且子进程不关闭自己的写端文件fd,读端(父进程)就要阻塞等待,直到管道里有数据。...管道内部被写满了且父进程(读端)不关闭自己的读端fd,写端(子进程)写满以后就要阻塞等待。...读端关闭了,操作系统就会发送信号直接杀死进行写入的进程,因为没有读端写入也就没有了意义。 1.2、五种特性 管道自带同步机制,参照上面四种情况中的1,2,3。...具有血缘关系的进程进行通信,常见于父子。 管道是面向字节流的。 父子进程退出,管道自动释放,因为内存中的文件的生命周期是随进程的。  管道只能进行单向通信。...,因为父进程在创建子进程的同时会将父进程的文件描述符表也给子进程拷贝一份, //这样子进程的文件描述符表就会保存了之前的子进程的写端文件描述符,必须要把之前的子进程的写端文件描述符关闭

    13810

    1.6 编写双管道ShellCode后门

    在管道创建时,操作系统会为管道分配一段内存区域,该内存区域由创建管道的进程和与其通信的进程共享。当进程往管道中写入数据时,数据会被存储在管道的内存缓冲区中,然后等待另一个进程从管道中读取数据。...管道操作的标识符是HANDLE句柄,当管道被正确创建时则,我们可以直接使用ReadFile、WriteFile等文件读写函数来读写它,读者无需了解网络间进程间通信的细节部分;一般匿名管道的创建需要调用CreatePipe...在使用CreatePipe函数创建匿名管道后,读者可以使用WriteFile函数往管道中写入数据,也可以使用ReadFile函数从管道中读取数据。读取和写入管道的操作需要使用相应的句柄。...如果命名管道为空,则函数会阻塞等待数据到来,当接收到数据时则读者即可通过调用ReadFile在管道中读取数据,或调用WriteFile来向管道写入数据,至此关键的API函数已经介绍完了;1.6.2 C语言实现双管道后门其实匿名管道反弹...CMD的工作原理可以理解为,首先攻击机发命令并通过Socket传给目标机的父进程,目标机的父进程又通过一个匿名管道传给子进程,这里的子进程是cmd.exe,CMD执行命令后,把结果通过另一个匿名管道返给父进程

    29341

    【Linux】IPC 进程间通信(一):管道(匿名管道&命名管道)

    匿名管道 2.1 什么是管道 进程可以通过 读/写 的方式打开同一个文件,操作系统会创建两个不同的文件对象 file,但是文件对象 file 中的内核级缓冲区、操作方法集合等并不会额外创建,而是一个文件的文件对象的内核级缓冲区...当父进程要传输数据给子进程时,就可以只使用以写方式打开的文件的管道文件,关闭以读方式打开的文件, 同样的,子进程只是用以读方式打开的文件的管道文件,关闭掉以写方式打开的文件。...此时会创建两个struct file,而文件的属性会共用,不会额外创建 如果此时又创建了子进程,子进程会继承父进程的文件描述符表,指向同一个文件,把父子进程都看到的文件,叫管道文件 管道只允许单向通信...当没有数据可读时 read 调用阻塞,即进程暂停执行,一直阻塞等待 read 调用返回-1,errno值为EAGAIN。...如果父进程没有给子进程传输任务,即管道文件中没有数据,根据进程通信情况1,读端即子进程会阻塞等待父进程传输任务。 此外父进程还要给子进程平衡任务,不能让某个进程特别繁忙,其他进程没有任务可做。

    13810

    1.6 编写双管道ShellCode

    在管道创建时,操作系统会为管道分配一段内存区域,该内存区域由创建管道的进程和与其通信的进程共享。当进程往管道中写入数据时,数据会被存储在管道的内存缓冲区中,然后等待另一个进程从管道中读取数据。...管道操作的标识符是HANDLE句柄,当管道被正确创建时则,我们可以直接使用ReadFile、WriteFile等文件读写函数来读写它,读者无需了解网络间进程间通信的细节部分;一般匿名管道的创建需要调用CreatePipe...在使用CreatePipe函数创建匿名管道后,读者可以使用WriteFile函数往管道中写入数据,也可以使用ReadFile函数从管道中读取数据。读取和写入管道的操作需要使用相应的句柄。...如果命名管道为空,则函数会阻塞等待数据到来,当接收到数据时则读者即可通过调用ReadFile在管道中读取数据,或调用WriteFile来向管道写入数据,至此关键的API函数已经介绍完了;1.6.2 C语言实现双管道后门其实匿名管道反弹...CMD的工作原理可以理解为,首先攻击机发命令并通过Socket传给目标机的父进程,目标机的父进程又通过一个匿名管道传给子进程,这里的子进程是cmd.exe,CMD执行命令后,把结果通过另一个匿名管道返给父进程

    35810

    【Linux】进程池实现指南:掌控并发编程的核心

    在循环中,父进程每次都会创建一个子进程出来,然后用管道于它们链接,注意因为是父进程给子进程分配任务,所以需要把父进程的读端关闭,子进程的写端关闭。...同时也多个重定向功能,把原本标准输入的功能给到了pipefd[0],也就是说当子进程去读标准输入内的数据时,会去读管道中的数据。...第三版:其实对于子进程来说,它的写端并没有全部关闭。下面我们来画图:创建第一个管道,这个图如果看过我讲匿名管道的那篇的话,还是比较熟悉的。...具体情况如图:所以为了关闭子进程的所有写端,我们需要用有个数组去保存父进程中的写端,然后再子进程中把它们一一关闭。...当然是进程等待了。杀死子进程也就是等待子进程。要注意的是别忘了关闭文件描述符进程等待是必须的,不然的话子进程会变成僵尸进程的。

    11010

    【Linux】进程间通信 --- 管道 共享内存 消息队列 信号量

    在匿名管道这里,我们通过fork创建子进程,让子进程继承父进程的文件描述符表,这样子进程中会有一个指向匿名管道文件的文件描述符,并且父进程也会有这样的文件描述符,当然是在fork之前,父进程要打开一个管道文件...进程等待管道文件,此时PCB会被放在管道文件的等待队列中,当管道中重新出现数据时,PCB会被重新投入到运行队列中,将数据从内核拷贝到用户层,只要没有数据,该进程就会一直阻塞等待 如果一直不写入,则父进程一直阻塞等待...所以我们打印输出status的低7位对应的数字信号是多少,看他是被几号信号杀死的。 6. a.写端写的慢,读端读的很快,则读端会阻塞下来,等待写端重新写入数据。...当父进程向某个子进程发送command code时,也就是对应的命令码,每个命令码对应一个需要子进程完成的任务,当父进程没发送command code的时候,其他未接收到命令码的子进程则一直进行阻塞等待即可...他其实是通过继承的方式,父进程打开一份内核级匿名管道文件,这个内核级文件的地址被放到文件描述符表里面,此时fork创建子进程,子进程通过自己的文件描述符表中的内核级匿名管道文件地址就可以找到这份公共资源

    1.5K40
    领券