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

为什么父进程无法从ETmode中的管道读取数据

父进程无法从ETmode中的管道读取数据的原因是因为ET(Edge Triggered)模式是一种事件触发模式,它只在状态发生变化时通知进程,而不会重复通知。在ET模式下,当管道中有数据可读时,内核会触发一次读事件,但如果父进程没有及时读取数据,下次再次触发读事件时,父进程可能会错过这次事件,导致无法读取到数据。

为了解决这个问题,可以采用以下方法之一:

  1. 使用非阻塞IO:将管道设置为非阻塞模式,这样父进程可以通过轮询或者使用select/poll等系统调用来检查管道是否有数据可读,从而及时读取数据。
  2. 使用信号机制:父进程可以注册一个信号处理函数,当管道中有数据可读时,内核会发送一个信号给父进程,父进程在信号处理函数中读取数据。
  3. 使用多线程或多进程:可以创建一个子线程或子进程来专门负责从管道中读取数据,父进程通过与子线程或子进程之间的通信来获取数据。

以上是一般的解决方法,具体的实现方式和选择取决于具体的应用场景和需求。

关于腾讯云相关产品,腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储、人工智能等。具体针对管道读取数据的问题,腾讯云没有特定的产品或服务与之直接相关。您可以参考腾讯云的官方文档和产品介绍页面,了解更多关于腾讯云的产品和服务信息。

腾讯云官方文档链接:https://cloud.tencent.com/document/product/213

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

相关·内容

如何在父进程中读取子(外部)进程的标准输出和标准错误输出结果

最近接手一个小项目,要求使用谷歌的aapt.exe获取apk软件包中的信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程的输出结果,当时还研究了一番,只是没有做整理。...这个问题,从微软以为为我们考虑过了,我们可以从一个API中可以找到一些端倪——CreateProcess。...我们之后将hWrite交给我们创建的子进程,让它去将信息写入管道。而我们父进程,则使用hRead去读取子进程写入管道的内容。...也就是说,我们设置的这些句柄要有可继承性。这就解释了我们之前为什么在创建管道时要将句柄可继承性设置为TRUE的原因。         一般来说,我们要代理的程序已经输入好信息了。...// 先分配读取的数据空间 DWORD dwTotalSize = NEWBUFFERSIZE; // 总空间 char* pchReadBuffer

3.9K10
  • 如何读取Linux进程中的代码段和数据段

    Linux下的程序的文件格式是ELF,里面分了各种段,有代码段、数据段、等。当运行这个程序时,系统也会给这个进程创建虚拟内存,然后把ELF中的数据分别加载到内存中的对应位置。...本文整理了用cpp程序读取内存中的代码段和rodata数据段的方法。.../proc/pid/mem mem是内核创建的虚拟文件,是Linux的”一切皆文件”在进程上的体现,但是这个文件无法直接进行读取,需要先利用ptrace进行绑定操作。...用ptrace绑定之后就可以用read来读取这个“文件”了,但是要注意输入读取的地址不对,也读不出数据来。...用程序读取内存的代码段和rodata数据段 以tcpdump程序为例,用程序读取代码段和radata的过程如下: 1.查看tcpdump的进程ID。

    3.9K20

    C语言第四章(进程间的通信,管道通信,pipe()函数)

    字符串写入了管道的写入端口,然后结束了其自身。 在父进程内部,它首先显示 “这里是父进程…” 消息,紧接着就开始等待从管道中读取数据。...因此,父进程通过 read() 函数从管道的读取端口读取数据,并将其存储到预先定义的缓存中。...最后,当从管道中读取数据并且子进程写完数据,程序输出 “父进程读取到消息了: Hello, world!” 与 “===> 子进程已经写完了!” 两个消息。...总结来看,该程序成功演示了使用管道在父进程与子进程之间进行通信的基本过程,父进程从读取管道中得到数据(“Hello, world!” ),说明了管道确实可以在两个进程之间传递数据。...因此,当程序运行时,父进程首先向子进程通过管道发送了一条消息,并关闭文件描述符;而子进程中对读文件描述符进行监听,等待数据传输,从管道的读取端接收到数据之后,再将其输出。

    9210

    【Linux】从零开始认识进程间通信 —— 管道

    1 为什么要进程间通信 以前我们学习的过程中,进程是具有独立性的。但有些时候需要多个进程进行协同,这时候就需要进程间的通信来保证信息的互通。...所以,进程间通信的成本的成本稍微高一些,因为进程本身是独立的,两个进程天然是无法进行数据共享的! 可是子进程建立的时候不是会拷贝(继承)一份父进程的数据吗,这不是进行通信吗???...进行通信的时候,每个进程关闭不需要的文件描述符,然后通过缓冲区来单向通信。一个进程把信息写入缓冲区,另一个进程从缓冲区读取数据,不需要刷新到硬盘,直接从内存进行操作!...读取 rfd 内的数据到inbuffer中,返回成功读取的个数。...父进程每5s读一次,并打印到显示器: 可以看到,右侧的子进程,左边是父进程。子进程写入好几次的数据,会被父进程一次读取一大批!!!

    12700

    【Linux】vscode的使用 | 进程间通信(简单概括)

    wc -l 进程 以读方式 打开文件 who进程将自己的标准输出重定向到管道中 wc -l 进程将自己的标准输入重定向到管道中 2.管道原理 每一个进程被创建时都有自己的文件描述符表 1....,右侧属于文件系统,属于操作系统在内存中打开的文件 文件描述表中保存的是文件的地址,所以依旧会指向父进程所对应的文件 ---- 管道只支持单向通信 确定数据流向,关闭关闭不需要的fd 若想要子进程进行写入...,父进程进行读取,关闭子进程对应的读端,以及父进程的写端 此时就可以正常通信了 为什么把读写都打开,只打开读或者写不可以吗?...若只打开读方式打开,则被子进程继承下去后依旧是只能以读方式打开,无法进行数据交互的 3....父进程读取消息 使用write 将缓冲区的count大小的数据写入 fd中 ssize_t read(int fd, void *buf, size_t count); 从文件描述符fd中将我们想要的数据

    88840

    进程间的通信--管道

    读写指针记录了当前文件读取或写入的位置,一个 struct file 中只有一个读写指针,在向文件写入(或读取)的时候,读写指针会发生移动,然后再去读取(写入),此时读写指针已经不再最初的位置,无法将刚写入的内容读取上来...接着创建子进程,子进程会继承父进程中打开的文件,也就是继承父进程的文件描述符表,此时父子进程就会共享同一个文件资源,子进程可以通过4号文件描述符向文件中进行写入,父进程就可以通过3号文件描述符从文件中进程读取...subProcessWrite(int wfd)函数用于子进程,它不断地生成消息并写入管道 (wfd) 中,每隔一秒发送一次消息 fatherProcessRead(int rfd)函数用于父进程,它不断地从管道...2.1.3管道的4种情况 如果管道是空的,并且写端文件描述符没有关闭,读取条件不具备,读进程(父进程)会被阻塞,自动等待读取条件具备(写入进程再重新写入)。...当父进程需要某一个子进程的时候,只需要将信息传入对应管道的写端,然后对应的子进程从管道读端读取数据。

    7610

    初识Linux · 匿名管道

    管道分为匿名管道和有名管道,我们从匿名管道开始介绍,到下篇文章介绍的进程池的小项目,到最后的命名管道,这是管道的介绍顺序,那么直接进入主题吧! 匿名管道 理解为什么?...因为如果是双向的,也就是父进程子进程的数据全部都在管道,读取的时候不经过一些操作肯定是要出错的,所以我们先简单就看看单向的。...为什么这里我们能得出的结论是子进程能继承父进程的文件描述符表,为了实现单向的管道通信我们需要关闭文件描述符。 理解是什么?...对于0 1是读还是写来说,我们结合形状吧,0是张开了嘴巴,所以是读取,1就是另一个了。 怎么做我们从三个部分开始,第一个是创建管道,第二个是子进程写入数据,第三个是父进程读取数据。...然后是主函数的父进程开始读取数据部分函数,大体思路仍然先关闭掉不需要的文件描述符,读取完之后,需要等待子进程退出,为了收集子进程的退出信息,并且我们可以打印出来: //3.父进程开始读取

    7910

    Linux:进程间通信(一.初识进程间通信、匿名管道与命名管道、共享内存)

    内存中的缓冲区:管道实际上是一个在内核中维护的缓冲区,用于存储从写入端发送但尚未被读取端读取的数据。这个缓冲区的大小是有限的,如果写入的数据超过了缓冲区的大小,写操作可能会被阻塞,直到有空间可用。...当读端从管道中读取数据时,这些数据会被从内核的缓冲区中移除(或称为消费),从而为写端提供了更多的空间来写入新的数据 在C语言中,可以使用pipe()函数来创建一个匿名管道。...这样,一个进程就可以通过pipefd[1]向管道写入数据,而另一个进程则可以通过pipefd[0]从管道中读取数据。这种机制使得两个进程之间可以通过管道进行通信。...reader(pipefd[0]); wait(NULL); return 0; } 不再向管道写入数据并且关闭了写端(子进程)文件描述符时,读端(父进程)可以继续从管道中读取剩余的数据...在打开命名管道时,进程需要指定相应的读写权限。 读写数据: 进程可以通过打开的文件描述符对命名管道进行读写操作。一个进程往管道中写入数据,另一个进程从管道中读取数据。

    44220

    【Linux】进程间通信——管道

    ,父进程可以向对应的文件的文件缓冲区写入,子进程可以通过文件缓冲区读取,此时就完成了进程间通信,这种方式提供的文件称为管道文件。...两个进程如何看到同一个管道文件:fork创建子进程完成 管道创建时分别以读和写方式打开同一个文件(如果只读或者只写,子进程也只会继承只读或只写,父子双方打开文件的方式一样,无法完成单向通信);父进程创建子进程...fds[1]); //通信 while(true) { char buffer[1024]; //管道中如果没有数据,读端在读,默认会直接阻塞当前正在读取的进程...: 1.读快写慢 子进程休眠时,不在写入,父进程在读取(如果管道中没有数据,读端在读,此时默认会直接阻塞当前正在读取的进程) 2.读慢写快 拿着管道读端不读,写端一直在写:写端往管道里写,而管道是有大小的...如果父进程只是sleep(2),稍微睡眠比较少: 在这里不断读取的时候:写端是把数据塞到管道里,管道读取的是按照指定大小读取!而不是一行一行。而我们刚开始按行读取的是因为发送的慢,一次塞一行数据。

    23240

    pipe和pipefd

    管道允许两个进程之间进行单向数据传输,通常是一个进程向管道写入数据,而另一个进程从管道读取数据。...pipefd[1] 通常用于写入数据。 数据从 pipefd[1] 写入后,会存储在内核缓冲区中,直到被 pipefd[0] 的读取操作读取。...在创建管道后,pipefd[0] 和 pipefd[1] 分别被赋予管道的读取和写入端。 pipefd[0]:管道的读取端,通常用于从管道中读取数据。...pipefd[1]:管道的写入端,通常用于向管道中写入数据。 在上述例子中,pipefd 被用作参数传递给 pipe 函数,并在子进程中用于读取数据,在父进程中用于写入数据。...0开始读 想让父进程固定的向管道里写入指定大小字节的内容,必须读取四个字节,四个字节四个字节的写和读,这里的管道64kb 必须读取四个字节 如果父进程不给子进程发送数据呢?

    9310

    【Linux修炼】15.进程间通信

    ,这份资源是由文件系统提供的,struct file包括file的操作方法和自己的内核缓冲区;父进程通过文件缓冲区将数据写入,子进程通过文件缓冲区将数据读取,这不就是一个进程写入,另一个进程读取,不就是进程间通信吗...三、管道文件的刷新 我们知道,struct file是从磁盘加载到内存的,而父子进程的每一次写入,struct file不会从内存中刷新到磁盘,虽然通过一定的操作是可行的,但进程与进程之间的通信是从内存到内存的...但当前这个管道文件并没有名字,所以被称为匿名管道。 ---- 为什么管道只能进行单向通信?我们本来所描述的就是单向通信,因此将其起名为管道。 为什么父进程分别以读和写的方式打开同一个文件?...2.3 管道的特点 读写特征: 上述代码中我们在子进程中sleep(1),实际上这使得父进程在read时暂停1秒,即在read(读)时阻塞;那如果把子进程的sleep去掉,在父进程中sleep(n),那么子进程的缓冲区就会被写满...2.5 进程控制多个子进程 父进程可以实现向任意一个子进程中写入,我们可以让父进程向任何进程中写入一个四字节的命令操作码,称之为commandCode,即现在想让哪一个进程运行,就向哪一个进程发送数据

    48800

    【Linux】基于管道进行进程间通信

    ,我们可以看到它的大小是 4KB;上面的手册中提到了原子性的问题,例如,当子进程往管道中写数据时,父进程读数据,当子进程只写了一部分数据,还没有写完,就被父进程读走了,这就导致读取到的数据不完整。...那么所以我们要保证,父进程在读的时候要么不读,要么就把完整的数据读取,这就叫做读取的原子性问题。...所以管道在保证读取的原子性,它规定 PIPE_BUF 的大小,只要是父进程或子进程读写的单位是小于 PIPE_BUF 的,它们读写的过程就是原子的,也就是说当子进程写入的数据小于 PIPE_BUF,父进程也不会来读取的...然后为了更好地控制这些子进程,父进程和每一个子进程都建立一条管道的信道,然后让每一个子进程只从管道中进行读取,而父进程每次想往哪个管道里写内容,就往哪个管道写内容。...当父进程没有向管道里写内容时,对应的子进程就会阻塞等待父进程派任务,一旦父进程向管道中写了,子进程会读取对应的数据然后继续向后执行,结合读取的数据就可以执行对应的任务了。

    22210

    WindowsAPI 之 CreatePipe、CreateProcess

    管 道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为 管道服务器,连接到一个管道的进程为 管道客户机。一个进程在向管道写入数据后,另 一进程就可以从管道的另一端将其读取出来。...匿名管道主要用于本地父进程和子进程之间的通信,在父进程中的话,首先是要创建一个匿名管道,在创建匿名管道成功后,可以获取到对这个匿名管道的读写句柄,然后父进程就可以向这个匿名管道中写入数据和读取数据了,但是如果要实现的是父子进程通信的话...如果父进程要发送数据到子进程,父进程可调用WriteFile()将数据写入到管 道(传递管道写句柄给函数),子进程则调用GetStdHandle()取得管道的读句柄,将该句柄传入ReadFile()后从管道读取数据...当父进程向子进程发送数据时,用SetStdHandle()将 管道的读句柄赋予标准输入句柄(这样就不会从标准输入读入数据,而从读句柄所表示的位置读取数据);在从子进程接收数据时,则用SetStdHandle...如果父进程要发送数据到子进程,父进程可调用WriteFile()将数据写入到管道(传 递管道写句柄给函数),子进程则调用GetStdHandle()取得管道的读句柄,将该句柄传入ReadFile()后从管道读取数据

    4.2K10

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

    比如在gdb调试时,用的就是gdb进程控制被调试的进程。 2.为什么要有通信?(多进程协同) 有时候单独进程的工作是无法满足需求的,所以我们是需要多进程协同完成某种业务内容的。...这是父进程在读取管道中的信息时这么认为的,他将管道中的数据看作字符串处理。...如果管道中没有了数据,此时读端继续读取的话,读端的默认行为是:直接阻塞当前正在读取的进程!...进程等待管道文件,此时PCB会被放在管道文件的等待队列中,当管道中重新出现数据时,PCB会被重新投入到运行队列中,将数据从内核拷贝到用户层,只要没有数据,该进程就会一直阻塞等待 如果一直不写入,则父进程一直阻塞等待...只要还有wfd没有关闭,就算wfd不往管道中写数据,你读进程也必须进行阻塞等待,read( )函数此时是无法被执行的,进程不会向下继续执行自身代码,因为他现在并不处于R状态,而是S状态,只有管道中有数据时

    1.5K40

    【linux学习指南】 进程间通信&&匿名管道&&理解管道的本质

    父进程可以向管道的写端 fds[1] 写入数据。 在子进程中: 子进程关闭管道的写端 fds[1]。 子进程可以从管道的读端 fds[0] 读取数据。...通过这种方式,父进程和子进程可以通过共享的管道进行通信。父进程将数据写入管道,子进程从管道中读取数据。 这个过程中,父进程和子进程各自持有管道的一端文件描述符,确保了数据的正确流向。...进程间通信: 当一个进程向管道的写端 fds[1] 写入数据时,数据会被写入内核缓冲区。 另一个进程可以通过读端 fds[0] 从内核缓冲区中读取数据。 这样就实现了进程间的通信。...这个缓冲区由内核维护,用户进程无法直接访问或修改它。 管道有两个文件描述符: 读端和写端,分别用于读取和写入数据。 管道的缓冲区: 管道的缓冲区大小是固定的,通常是几千字节。...当写端向管道写入数据时,数据会被存储在缓冲区中。 当读端从管道读取数据时,数据会从缓冲区中取出。 读写机制: 写入管道时,如果缓冲区已满,写进程会被阻塞,直到有空间可写。

    8410

    进程间通信--管道

    1.在不关闭写端的情况下一直不向管道文件中写入,那么读端就会阻塞式读取(一定要读取到数据才会往下继续执行) 2.在不关闭读端的情况,一直向管道中写但不读取,文件的缓冲区满以后会一直等待读端来读取 3....cat file会创建一个进程,这个进程会读取file文件并将读取到的内容写到到|管道文件中,grep也是一个进程,这个进程会到|管道文件中读取数据。...3.将函数指针数组的下标作为数据写到管道文件中 4.让子进程去管道文件中读取code,再让子进程拿着code去函数指针数组中查找任务并执行 5.子进程结束后需要父进程回收资源 #include..._writefd, &taskNum, sizeof(taskNum)); assert(n == sizeof(int)); (void)n; } //从管道文件中读取数据 int...,所以文件发生变化的时候,进程可以感知到 下面通过客户端向往文件中写入数据,服务端从文件中读取数据来感受命名管道: 1.name_pipe.hpp #include #include

    21330

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

    1.进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程...进程间通信分类 Linux进程间通信可以分为以下几种分类: 匿名管道(Pipe):管道是一种半双工的通信机制,可以在同一个进程中的两个文件描述符之间传递数据。...读进程从管道中读取数据,写进程向管道中写入数据。管道只能在具有父子关系的进程之间使用。   ...父进程创建子进程: 子进程拷贝父进程的task_struct,这也就是为什么父进程要先将管道创建出来,再创建子进程并且要将读写文件同时打开,是为了给子进程继承 如果父进程写入,子进程读取,那么就将父进程读取端关闭...,子进程写入端关闭;如果父进程读取,子进程写入,那么就反之: 如果不关文件描述符,会造成文件描述符泄露并且可能会误操作,所以建议关闭 管道的通信是单向的,即父进程或子进程不能对一个管道同时读和写,

    11500

    【Linux】进程间通信——管道通信

    管道本质上是一个 FIFO(First In, First Out) 的数据流,写入数据的一端称为 写端,读取数据的一端称为 读端。 为什么可以实现通信?...就拿上图为例,上图的公共资源就是内核级缓冲区,上面的进程是父进程,下面是子进程,这里的公共资源就是文件的内核级缓冲区,所以父进程就可以向内核级缓冲区写数据,然后子进程读取内核级缓冲区的数据。...{ //从fds0中读取数据读到buffer当中 ssize_t n = read(fds[0],buffer,1024);...当上面时间间隔改为每五秒传递一次消息的时候,子进程没有发送消息的时候父进程是阻塞的,阻塞在read,因为read是系统调用,所以设计接口的时候,当管道内的消息读完,写端没有传递新的消息过来,read直接将这个进程设置为阻塞状态防止读取空管道信息出现乱码...通过匿名管道,进程可以顺序读写数据,但由于其单向通信、基于字节流、生命周期受限于进程等特性,在实际开发中需要合理设计数据格式,避免读取不完整数据或出现阻塞问题。

    5200

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

    ,拿数据按报文段拿 不论写端写入了多少数据,只要写端停止写入,读端都可以将数据读取 5.具有一定的协同能力,让 读端 和 写端 能够按照一定的步骤进行通信(自带同步机制) 当读端进行从管道中读取数据时,...的数据" << endl; } //父进程(不写) while (true) {} 结果:因为管道为空,因此子进程无法读取,即 读端阻塞 只有当写端写入数据后,读端才能正常读取 6.2...cnt++ 的数据" << endl; } 结果:在一段时间后,管道被写满,写端无法写入数据,进入阻塞状态 只有当读端尝试将管道中的数据读走一部分后,写端才能继续写入 形象化理解...管道为空:垃圾桶为空时,你不会去倒垃圾(读端阻塞),因为没有垃圾,需要等有垃圾了(写入数据)才去倒 管道为满:垃圾桶中的垃圾装满时,无法再继续扔垃圾(写端阻塞),需要等把垃圾倒了(读取数据),才能继续扔垃圾...,获取大小,极大提高了效率 三、通过程序验证 这个前面就已经验证过了,不断往管道中写数据,直到管道被写满 每次写入 1 字节的数据,可以看到最终写了 65536 字节的数据 总之,从 Linux

    32720
    领券