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

读取子进程中的管道时,读取系统调用返回-1

表示读取失败。这种情况通常发生在以下几种情况下:

  1. 管道未正确创建或打开:在父进程中创建管道时,可能出现了错误,导致管道无法正确打开。这可能是由于权限问题、文件描述符错误或其他原因导致的。在这种情况下,需要检查管道的创建和打开过程,确保没有错误发生。
  2. 子进程中的管道被关闭:在子进程中,可能已经关闭了与管道相关的文件描述符。如果子进程在读取管道之前关闭了管道的写入端,那么读取系统调用将返回-1,表示管道已关闭。在这种情况下,需要检查子进程中的管道关闭操作,确保管道在读取之前保持打开状态。
  3. 管道中没有数据可读:如果管道中没有数据可供读取,读取系统调用将阻塞并等待数据的到来。但是,如果管道已经关闭,并且没有数据可供读取,读取系统调用将返回-1,表示没有数据可读。在这种情况下,需要确保在读取之前有数据写入到管道中。

总结起来,读取子进程中的管道时,读取系统调用返回-1可能是由于管道未正确创建或打开、子进程中的管道被关闭或者管道中没有数据可读所导致的。在解决这个问题时,需要仔细检查管道的创建、打开和关闭过程,以及数据的写入和读取操作,确保没有错误发生。

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

相关·内容

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

最近接手一个小项目,要求使用谷歌aapt.exe获取apk软件包信息。依稀记得去年年中,有个同事也问过我如何获取被调用进程输出结果,当时还研究了一番,只是没有做整理。...这个API参数非常多,我想我们工程对CreateProcess调用可能就关注于程序路径(lpApplicationName),或者命令行(lpCommandLine)。...它是我们启动进程,控制进程启动方式参数。...我们之后将hWrite交给我们创建进程,让它去将信息写入管道。而我们父进程,则使用hRead去读取进程写入管道内容。...也就是说,我们设置这些句柄要有可继承性。这就解释了我们之前为什么在创建管道要将句柄可继承性设置为TRUE原因。         一般来说,我们要代理程序已经输入好信息了。

3.9K10

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

)就要阻塞等待,直到pipe有数据 管道没有数据,读端继续读取默认行为是阻塞当前正在读取进程。...reader(pipefd[0]); wait(NULL); return 0; } 不再向管道写入数据并且关闭了写端(进程)文件描述符,读端(父进程)可以继续从管道读取剩余数据...最后就会读到返回值为0,表示读结束,类似读到了文件结尾 读端关闭其文件描述符并且不再读取数据,如果写端继续向管道写入数据,操作系统会发送一个SIGPIPE信号给写端进程。...在打开命名管道进程需要指定相应读写权限。 读写数据: 进程可以通过打开文件描述符对命名管道进行读写操作。一个进程管道写入数据,另一个进程管道读取数据。...返回值:成功返回0;失败返回-1并设置errno。 shmctl():控制共享内存 shmctl() 系统调用用于获取或设置共享内存属性,或者删除共享内存对象。

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

    wc -l 进程 以读方式 打开文件 who进程将自己标准输出重定向到管道 wc -l 进程将自己标准输入重定向到管道 2.管道原理 每一个进程被创建都有自己文件描述符表 1....为 3 与 4 ,正好对应 数组中下标 3与4位置 系统调用为什么可以使用c语言errno 正常来说,是调用c语言接口出错了,才调用errno 或者 strerror 为什么调用系统调用接口...,也会使用 errno来说明错误原因 系统调用接口是由系统使用c语言一套软件 2.创建进程以及通信 关闭不需要fd,让父进程进行读取,让进程进行写入 一般认为pipefd[0] 为读端 ,...,按照数据块方式读取出来 返回值代表多少字节,读取到文件结尾为0,失败为-1 read读取并不会把buffer当作一个字符串,而我们要把buffer看作是一个字符串,所以要预留出\0位置 即 sizeof...=-1);//返回-1,说明创建进程失败 if(id==0) { //进程 //让父进程进行读取,让进程进行写入 close(pipefd

    84340

    MIT 6.S081 (BOOK-RISCV-REV1)教材第一章内容 --- 操作系统接口

    当一个进程需要调用一个内核服务,它会调用一个系统调用,这是操作系统接口中一个调用系统调用进入内核;内核执行服务并返回。因此,一个进程在用户空间和内核空间之间交替执行。...) 删除一个文件 xv6系统调用(除非另外声明,这些系统调用返回0表示无误,返回-1表示出错) 本章其余部分概述了xv6服务——进程、内存、文件描述符、管道和文件系统——并用代码片段和关于shell...在父进程,fork返回子类PID; 在进程,fork返回零。...例如:当wait返回值存入父进程变量pid,并不会影响进程pid,进程pid仍然为0。 exec系统调用使用从文件系统存储文件所加载新内存映像替换调用进程内存。...当wc从它标准输入读取,就是从管道读取。 父进程关闭管道读取端,写入管道,然后关闭写入端。

    27520

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

    进程需要内核所提供服务进程调用了称为系统调用操作系统接口。系统调用会进入内核,内核执行相应服务后返回用户空间,所以进程总是在用户空间与内核空间之间交替进行着。...在父进程程序,fork函数返回进程pid,而在进程程序,fork函数返回0。...当没有更多数据可以读取,read返回0,表示文件结束了。 系统调用write(fd,buf,n)从buf取出n个字节输入写入到文件描述符fd所指文件,并返回写入字节数。...执行了fork之后,父进程进程都拥有与管道相关文件描述符。进程复制了管道一端到文件描述符0,接着关闭了文件描述符p[0]及p[1],然后执行了系统调用wc。...当wc从标准输入读取,它实际上是从管道读取数据。父进程管道写端口写入数据,然后关闭了管道文件描述符。

    60160

    C语言 进程

    现在有两个一模一样进程看起来都调用了fork进入内核等待从内核返回(实际上fork只调用了一次),此外系统还有很多别的进程也等待从内核返回。...init是系统一个特殊进程,通常程序文件是/sbin/init,进程id是1,在系统启动负责启动各种系统服务,之后就负责清理进程,只要有进程终止,init就会调用wait函数清理它。...pipe函数调用成功返回0,调用失败返回-1。通信步骤1. 父进程调用pipe开辟管道,得到两个文件描述符指向管道两端。2. 父进程调用fork创建进程,那么子进程也有两个文件描述符指向同一管道。...0),而仍然有进程管道读端读数据,那么管道剩余数据都被读取后,再次read会返回0,就像读到文件末尾一样.如果有指向管道写端文件描述符没关闭(管道写端引用计数大于0),而持有管道写端进程也没有向管道写数据...,这时有进程管道读端读数据,那么管道剩余数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回.如果所有指向管道读端文件描述符都关闭了(管道读端引用计数等于0),这时有进程管道写端

    1.2K10

    pipe和pipefd

    Linux pipe 详细介绍 在 Linux ,pipe 是一个系统调用,用于创建一个管道,这是一种用于进程间通信(IPC)机制。...管道工作原理 当 pipe 调用成功,它会返回两个文件描述符,分别对应管道两端:pipefd[0] 和 pipefd[1]。 pipefd[0] 通常用于读取数据。...创建管道 使用 pipe 系统调用来创建管道: #include int pipe(int pipefd[2]); 如果 pipe 调用成功,它将返回 0;如果失败,则返回 -1...pipefd[1]:管道写入端,通常用于向管道写入数据。 在上述例子,pipefd 被用作参数传递给 pipe 函数,并在进程中用于读取数据,在父进程中用于写入数据。...sleep,父进程不sleep,父进程还是会跟着进程sleep,因为父子进程是要协同 管道本质 通信是为了更好发送变化数据,管道本质上是文件 所以必须要用到系统调用接口来访问管道,其是由系统管理

    7710

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

    由于管道文件并非磁盘文件而是一个内存级文件,所以我们不应该用open这样接口打开管道文件,而是有专门系统调用来创建管道文件,这个系统调用就是pipe,他参数是一个输出型参数,用于修改形参pipefd...[ ]对应外面的数组内容,一般我们自己创建一个int类型大小为2数组,用于存放打开管道读写文件描述符,pipe接口调用成功时会返回0,调用失败时会返回-1,并且errno错误码会被设置。...下面是父进程作为读取通信代码,在调用read读取,我们将读取大小最大设置为sizeof buffer -1,这是为了在读取数据超过缓冲区大小时,我们仍然能够在缓冲区预留出最后一个位置放\0,这样做目的其实是在读取...这是父进程读取管道信息这么认为,他将管道数据看作字符串处理。...另外需要注意一点是,在recvTask里面,读取如果读取到0,那其实就是EOF信号,说明此时管道写端已经关闭了,那读端就没有必要读下去了,所以我们让recvTask返回-1,如果command code

    1.4K40

    Linux通过匿名管道进行进程间通信

    2、不要用file_descriptor[0]写数据,也不要用file_descriptor[1]读数据,其行为未定义,但在有些系统上可能会返回-1表示调用失败。...可见,进程读取了父进程写到filedes[1]数据,如果在父进程没有sleep语句,父进程可能在进程结束前结束,这样你可能将看到两个输入之间有一个命令提示符分隔。...例子 在下面的例子,首先打开管道,然后fork一个进程,然后在进程,使标准输入指向读管道,然后关闭进程管道和写管道,只留下标准输入,最后调用execlp函数来启动一个新进程od,但是...五、关于管道关闭后读操作讨论 现在有这样一个问题,假如父进程管道file_pipe[1]写数据,而进程管道file_pipe[0]读取数据,当父进程没有向file_pipe[1]写数据...再者父进程把file_pipe[1]关闭了,进程又会有什么反应呢? 当写数据管道没有关闭,而又没有数据可读,read调用通常会阻塞,但是当写数据管道关闭,read调用将会返回0而不是阻塞。

    1.3K21

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

    由fork创建进程被称为进程(child process)。该函数被调用一次,但返回两次。两次返回区别是进程返回值是0,而父进程返回值则是新进程进程进程 id。...,指令指针也完全相同,进程拥有父进程当前运行到位置(两进程程序计数器pc值相同,也就是说,进程是从fork返回处开始执行),但有一点不同,如果fork成功,进程fork返回值是0,父进程...(粉红色部分为select部分,黄色部分为命名管道部分) 在linux系统,除了用pipe系统调用建立管道外,还可以使用C函数库管道函数popen函数来建立管道,使用pclose关闭管道。...使用popen函数读写管道,实际上也是调用pipe函数调用建立一个管道,再调用fork函数建立进程,接着会建立一个shell 环境,并在这个shell环境执行参数所指定进程。...例子:用函数msget创建消息队列,调用msgsnd函数,把输入字符串添加到消息队列,然后调用msgrcv函数,读取消息队列消息并打印输出,最后再调用msgctl函数,删除系统内核消息队列。

    1.1K30

    Linux 下进程间通信:使用管道和消息队列

    尽管这个程序只有一个单一源文件,在它正确执行情况下将会发生多进程情况。 下面的内容是对库函数 fork 如何工作一个简要回顾: fork 函数由父进程调用,在失败返回 -1 给父进程。...假如 fork 调用成功,则它将创建一个新进程,向父进程返回一个值,向进程返回另外一个值。在调用 fork 后父进程进程都将执行相同代码。...(进程继承了到此为止父进程声明所有变量拷贝),特别地,一次成功 fork 调用返回如下东西: 向进程返回 0 向父进程返回进程进程 ID 在一次成功 fork 调用后,一个 if...进程可以执行任意代码,而它们可能与父进程完全没有关系。但是,假如当进程终止系统将会通过一个信号来通知父进程。 要是父进程进程之前终止又该如何呢?...在效果上,进程会告诉系统立刻去通知父进程这个子进程已经终止了。 假如两个进程向相同无名管道写入内容,字节数据会交错吗?

    1.2K20

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

    我们把从一个进程连接到另一个进程一个数据流称为一个"管道" 任何一个文件包括两套资源:1.file操作方法 2.有属于自己内核缓冲区,所以父进程进程有一份公共资源:文件系统提供内核缓冲区...pipe pipe:创建一个管道只需要调用pipe,注意头文件,返回值,以及函数参数 头文件为#include ,调用成功返回0,调用失败返回-1。...fds[1]); //通信 while(true) { char buffer[1024]; //管道如果没有数据,读端在读,默认会直接阻塞当前正在读取进程...: 1.读快写慢 进程休眠,不在写入,父进程读取(如果管道没有数据,读端在读,此时默认会直接阻塞当前正在读取进程) 2.读慢写快 拿着管道读端不读,写端一直在写:写端往管道里写,而管道是有大小...3.写入关闭,读到0 进程写入端关闭: 4.读取关闭,写入 管道是单向:读端关闭,在写入就没有意义了:OS会终止写端,会给写进程发送信号,终止写端 管道特征 1.管道生命周期随进程进程退出

    22240

    Linux之进程间通信——管道

    所以父子进程有一份公共资源:文件系统提供内核缓冲区,父进程可以向对应文件文件缓冲区写入,进程可以在对应文件缓冲区读取,这样就可以完成进程间通信。...父进程创建进程进程继承管道以及对管道读写 父进程关闭读取端,进程关闭写入端。自此父进程只能向管道写入,进程只能从管道读取,完成了父子进程单向通讯。...匿名管道可以用来进行父进程进程之间进程间通信。 pipi pipi创建一个管道,只需要调用pipe系统调用。...它头文件是unistd.h;调用成功就返回0,调用失败就返回-1;其参数是输出型参数。...46 return 0; 47 } 读写特征 读快,写慢 进程休眠,不再写入,父进程仍在读取(如果管道内没有数据,而读端在读取,则会默认直接阻塞当前正在读取进程);

    33031

    Linux内核编程--管道pipe

    管道定义: 管道是一种进程间通信机制,也是Linux操作系统一种文件形式。一个进程写入管道数据可以被另一个进程读取。数据按先进先出顺序处理。Linux有两种形式管道文件,管道和FIFO。...管道成功创建返回0 *有些版本操作系统可以创建全双工管道,使用socketpair函数创建 管道创建经典场景: 一个进程在它派生一个或多个子进程之前创建一个管道, 然后将管道用于父进程进程之间或两个兄弟进程之间通信...) --成功运行后,向进程返回0,并向父进程返回进程进程ID Demo1: 父进程关闭管道读端,只往写端写入数据;进程关闭管道写端,只从读端读出数据 #include <sys/types.h...,没有正常调用fork()或pipe()返回 NULL --popen()会调用fork()产生子进程,然后从子进程调用/bin/sh -c来执行参数command指令 --参数type可使用"r..."代表读取,"w"代表写入 --popen()会建立管道连到进程标准输入/输出设备,然后返回一个文件指针 int pclose(FILE *stream); --运行成功返回0,失败返回-1

    3.8K10

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

    1 为什么要进程间通信 以前我们学习过程进程是具有独立性。但有些时候需要多个进程进行协同,这时候就需要进程通信来保证信息互通。...首先,一定是某一个进程先需要通信,让OS创建一个共享资源 那么OS必须通过对应系统调用来创建共享资源 OS创建共享资源不同 , 系统调用接口不同----就导致进程间通信会有不同种类 3 进程通信常见方式...当然也可以不关闭,只要你不乱使用,所以为了排除风险,建议直接关闭 4.2 管道通信系统调用 了解了管道是什么,我们就来看看关于管道系统调用是什么吧?...读取 rfd 内数据到inbuffer,返回成功读取个数。...: 管道被写满,写进程会被阻塞,写条件不具备-- wait 等待条件具备(读取走一部分数据才能继续写) 管道一直在被读 && 写端关闭了wfd: 读端read返回值会读到 0 ,表示到了文件结尾

    11900

    CreatePipe、CreateProcess函数

    一个进程在向管道写入数据后,另 一进程就可以从管道另一端将其读取出来。...第二:匿名管道只能实现父进程进程之间通信,而不能实现任意两个本地进程之间通信。...CreatePipe还会在随后ReadFile和WriteFile函数调用创建该进程用于读取和写入缓冲区句柄。 要从管道读取,一个进程调用ReadFile函数使用读取句柄。...当以下任一条件为真,ReadFile返回:写操作在管道写入端完成,请求字节数已被读取或发生错误。 当一个进程使用WriteFile写入匿名管道,写操作在所有字节都被写入之前不会完成。...当命名管道实例最后一个句柄关闭管道实例总是被删除。 0x02、CreateProcess 创建一个新进程及其主要线程。新进程调用进程安全上下文中运行。

    1.3K30

    【Linux】进程间通信详解

    然后cat进程通过stdin,进行从管道读取,并对stdout重定向,输出到文件log.txt。...调用成功返回0,失败返回-1. 通信步骤 1、父进程调用pipe函数创建管道  2、fork创建进程 3、父关闭写,关闭读。...第二个参数就是该共享内存大小。第三个参数表示创建共享内存方式选项。当共享内存创建成功,会返回共享内存id值(identifier),失败返回-1。...一般如下: shmflg参数选项 代表含义 SHM_RDONLY 只读模式,只可以进行读取操作 0 读写都可 当关联成功,会返回映射到进程地址空间起始地址,失败返回-1。...去关联成功返回0,失败返回-1. 代码演示 这里,我们通过管擦ipcs -m,可以看到nettch对应值先是由0变成1,再由1变成0。

    43620

    【Linux】进程间通信上 (1.5万字详解)

    我们使用fork函数创建进程,操作系统会为进程拷贝一份父进程PCB,程序地址空间,列表等等。 但是父子进程会共用一个文件描述符数组吗?...此时,如果我们用read系统调用读取一个空管道,则read将被阻塞,直到管道内有数据可读;如果我们用write系统调用往一个满管道写数据,则write也将被阻塞,直到管道内有足够空闲空间可用(...现在我们让进程一直在写,父进程每隔5秒钟读一次,我们还是使用上面的测试代码: 综合打印结果,我们发现:读端从管道读取数据,当管道数据足够多时, 读端会将缓冲区读满。...所以读端就会一次性读取1023个字节数据。 总结:读端读取数据,如果管道数据足够多时,读端就会读满设定缓冲区。如果管道数据不够填满给读端准备缓冲区,读端就会一次性把所有数据给读完。...只能用于具有共同祖先进程(具有亲缘关系进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、进程之间就可应用该管道。同样,兄弟进程,爷孙进程都可以利用管道进行通信。

    14810

    进程通信--管道

    如何让操作系统创建资源: 一定是,某一个进程先需要通信,让OS创建一个共享资源 OS必须提供很多系统调用,让进程系统调用方式申请系统资源 OS创建共享资源不同、系统调用接口不同决定进程间通信会有不同种类...(rfd) 读取消息并输出到控制台 进程关闭不需要管道读取端 (pipefd[0]),调用 subProcessWrite() 发送消息,然后关闭写入端 (pipefd[1])。...父进程关闭不需要管道写入端 (pipefd[1]),调用 fatherProcessRead() 接收消息,然后关闭读取端 (pipefd[0])。...2.1.4管道五种特征 匿名管道:只能用来进行具有血缘关系进程之间通信(常用于父子进程),因为进程是对父进程拷贝,不能用于毫不相关两个进程。...当父进程需要某一个进程时候,只需要将信息传入对应管道写端,然后对应进程管道读端读取数据。

    7210

    【操作系统进程通信——管道

    管道是FIFO(先进先出)。 在实际进程间通信,可以理解为有一条管道,而每个进程都有两个可以使用管道"端口",分别负责进行数据读取与发送。...具体操作流程: p1 创建管道。 创建进程。 在进程中使用execl()函数,将进程替换为程序p2。(在使用execl函数,把管道读端作为参数。)...在父进程,通过管道进程发送字符串。 p2 从参数获取管道读端(参数即p2main函数参数)。 读管道。 将读取字符串打印出来。...在读取数据管道读端数据会越读越少,而在写入数据,写入数据会累加,添加到尾部。...-1 return 0; } ---- 使用popen/pclose popen作用:用于在两个进程之间传递数据:在程序A中使用popen调用程序B,有两种用法: 程序A读取程序B输出

    65620
    领券