首页
学习
活动
专区
工具
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.8K10

如何读取Linux进程代码段和数据

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

3.5K20

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

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

8300

【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中将我们想要数据

77740

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

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

18240

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

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

44200

WindowsAPI 之 CreatePipe、CreateProcess

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

3.7K10

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

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

14410

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

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

1.2K40

进程间通信--管道

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

17930

Linux进程间通信【匿名管道

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

21720

Swoole进程模块

,读键盘输入可以重定向为管道读取数据 3.swoole_process提供了exec接口,创建进程可以执行其他程序,与原PHP进程之间可以方便通信 创建进程 函数原型: Swoole\Process...$redirect_stdin_stdout,重定向子进程标准输入和输出。启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道读取键盘输入将变为管道读取数据。默认为阻塞读取。...会发现,每次创建一个进程后,就会随之创建一个管道,主进程想和哪一个进程通信,就向那个进程管道写入/读取数据。...管道有2个方法,分别来写入数据,和读取数据。...PHP_EOL; }, false, true); $pid = $process->start(); $process->write('主进程数据'); // 异步监听管道数据

75630

Swoole进程模块

,读键盘输入可以重定向为管道读取数据 3.swoole_process提供了exec接口,创建进程可以执行其他程序,与原PHP进程之间可以方便通信 创建进程 函数原型: Swoole\Process...$redirect_stdin_stdout,重定向子进程标准输入和输出。启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道读取键盘输入将变为管道读取数据。默认为阻塞读取。...会发现,每次创建一个进程后,就会随之创建一个管道,主进程想和哪一个进程通信,就向那个进程管道写入/读取数据。...管道有2个方法,分别来写入数据,和读取数据。...PHP_EOL; }, false, true); $pid = $process->start(); $process->write('主进程数据'); // 异步监听管道数据

1K20

Linux进程通信——管道

进程往文件缓冲区写数据,子进程从缓冲区读数据,这个就是进程之前通信,这个方法及操作系统提供内核文件,称为管道文件。(管道本质上就是文件) 那么需不需要将文件缓冲区内容经过磁盘呢?...最后一部就是让进程关闭读端,子进程关闭写端,这样就能让进程给子进程读取数据了。 一般而言,我们管道只能用来单项数据通信。 管道就是输送资源,就是数据。...这种通信,称之为管道通信。 这个过程其实就相当于进程通过操作系统写给管道,也就是相当于写给操作系统,然后子进程通过操作系统管道当中读取内容。...这说明如果管道没有数据了,读端在读,默认会直接阻塞当前正在读取进程,只有管道数据,操作系统识别到,读端才会去读取数据。 2. 管道是一个固定大小缓冲区。...创建第二个子进程时候,第二个子进程也继承了进程文件描述符表,同样是关闭对应读写端,但是进程文件描述符表还存着对于第一个子进程写端,这就是一个隐藏bug。

3.9K70

进程间通信(一)管道

如果是一个普通文件,我们往文件里面写入数据,那么除了把数据放在文件缓冲区里面,还要把这些数据要刷新到磁盘。...接着进程间通信,一个进程往文件里面写数据,刷新到磁盘,然后操作系统磁盘里面拿数据,加载到内存,另外一个进程再从内存拿到进程上下文,这种方法很慢。...结果我们可以看到,子进程负责写入,然后将数据交给了进程进程负责读取!这种通信方式,就叫做管道通信方式!...读写特征: ①写入时候有sleep间隔,读取没sleep间隔 上面的代码有一个细节,那就是我们在子进程写入时候,是每隔1秒写入一次,而在进程读取数据时候,没有时间间隔。...这就证明了,如果管道没有数据,读端在读时候,默认阻塞当前在读进程

45820

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

每个文件描述符都与一个偏移值相关,read读取数据当前文件偏移值开始读取,然后偏移值增加成功读取字节数,随后read会从新文件偏移读取数据。...管道 管道是一个小内核缓冲区,它提供了两个文件描述符给两个进程,一个用于读取数据,另一个用于写入数据管道一端写入数据,可以使这些数据管道另一端被读取管道提供了进程间通信一种方式。...当wc标准输入读取时,它实际上是管道读取数据进程管道写端口写入数据,然后关闭了管道文件描述符。...如果管道没有可用数据管道读取数据系统调用read将一直等待,直到有数据写入管道或者所有与管道写端口关联文件描述符都被关闭。...在后面这种情况,read返回0,就好像数据读取已经到了文件结束部分(end-of-file)。读操作会一直阻塞直到不可能有新数据到来,这就是为什么我们在执行wc之前要关闭子进程写端口。

57760

Linux之进程间通信——管道

为什么需要进程间通信? 有时候我们需要多进程协同,共同完成某种业务内容。例如:管道。 3.进程间通信分类 我们所说不同通信种类本质上是按照:上面所说资源是OS哪一个模块提供来划分。...fork创建子进程管道创建时,要分别以读和写方式打开同一个文件(如果进程是以只读或只写方式(其中一种方式)打开文件,子进程也只会继承只读或者只写,父子双方打开文件方式一样,导致无法完成单向通信...进程创建子进程,子进程继承管道以及对管道读写 进程关闭读取端,子进程关闭写入端。自此进程只能向管道写入,子进程只能从管道读取,完成了父子进程单向通讯。...46 return 0; 47 } 读写特征 读快,写慢 子进程休眠时,不再写入,进程仍在读取(如果管道内没有数据,而读端在读取,则会默认直接阻塞当前正在读取进程);...47 return 0; 48 } 如果,让进程只sleep(2)的话,读取速度稍微比较慢: 这种情况,写端是将数据塞到管道内,管道读取是安装指定大小读取(并非一行一行读取

25431

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

代码为了避免向读取端写入和写入端读取而引发错误,在读时候关闭写端,在写时候关闭读端。 代码先让进程管道文件写入了字符串“Hello World!”。...然后子进程读取管道文件字符串,并向屏幕打印。程序执行结果如下: ? 如果子进程读取管道文件为空,那么read()函数将会使得进程阻塞,这时候进程将会执行,然后完成对管道文件写入。...之后wait()将进程挂起,子进程完成读取。同样,管道已经满时,进程再试图写管道,在其它进程管道移走数据之前,写进程将一直阻塞。...(典型生产者——消费者模型)管道是存在于内存文件(实际上内核实现一个队列),他是进程资源,会随着进程销毁而销毁。还有一点是管道东西在读取后就会被删除。...这个时候,在进程中将无法写入。所以管道这个描述还是很形象,当你向一段水管里面装水时候,需要将另一端堵上,否则装入水全都流走了。因此在进程时候,需要先关闭读;在子进程时候需要先关闭写。

1.4K10

进程间通信和线程间通信区别_有些线程包含多个进程

,指令指针也完全相同,子进程拥有进程当前运行到位置(两进程程序计数器pc值相同,也就是说,子进程fork返回处开始执行),但有一点不同,如果fork成功,子进程fork返回值是0,进程...管道实质是一个内核缓冲区,进程以先进先出方式从缓冲区存取数据管道一端进程顺序地将进程数据写入缓冲区,另一端进程则顺序地读取数据,该缓冲区可以看做一个循环队列,读和写位置都是自动增加,一个数据只能被读一次...无名管道: pipe例子:进程创建管道,并在管道写入数据,而子进程管道读出数据 命名管道: 和无名管道主要区别在于,命名管道有一个名字,命名管道名字对应于一个磁盘索引节点,有了这个文件名,...对消息队列有写权限进程可以向消息队列按照一定规则添加新消息,对消息队列有读权限进程可以消息队列读取消息。...采用共享内存进行通信一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据拷贝,对于像管道和消息队里等通信方式,则需要再内核和用户空间进行四次数据拷贝,而共享内存则只拷贝两次:一次输入文件到共享内存区

84230
领券