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

父子进程使用管道通话,"execlp“后挂起,为什么?

父子进程使用管道通信时,"execlp"函数调用后挂起的原因是管道的读端和写端都需要被关闭才能正常通信。

在父子进程通信中,通常会创建一个管道(pipe),它是一种特殊的文件,具有读端和写端。父进程通过写端向管道写入数据,子进程通过读端从管道读取数据,实现进程间的通信。

当父进程调用"execlp"函数时,它会创建一个新的子进程,并在子进程中执行指定的程序。在这个过程中,子进程会继承父进程的文件描述符,包括管道的读端和写端。

在父子进程通信中,为了确保通信的正常进行,需要关闭不需要的文件描述符。具体来说,父进程需要关闭管道的读端,子进程需要关闭管道的写端。

如果父进程在调用"execlp"函数之前没有关闭管道的读端,那么子进程在继承父进程的文件描述符时,会保留管道的读端。而子进程在执行"execlp"函数后,会替换自己的进程映像,关闭所有继承自父进程的文件描述符,包括管道的读端。这样,父进程就无法通过管道的写端向子进程发送数据,导致通信无法进行,父进程会挂起等待子进程读取数据。

因此,为了避免父子进程通信的问题,需要在父进程调用"execlp"函数之前关闭管道的读端,确保通信的正常进行。

关于管道的更多信息和使用场景,您可以参考腾讯云的相关产品和文档:

  • 腾讯云产品:云服务器 CVM(https://cloud.tencent.com/product/cvm)
  • 腾讯云文档:Linux 管道(https://cloud.tencent.com/document/product/213/10578)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

exec族

所以今天又温故了一遍: 为什么需要exec函数?...fork子进程是为了执行新程序(fork创建了子进程,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行) 可以直接在子进程的if中写入新程序打代码...但这样不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制) 使用exec族函数运行新的可执行程序。...有了exec族函数,典型打父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译链接成一个可执行程序(hello)。...主进程为父进程,fork创建了子进程在子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。

1.1K10

进程间通信】IPC、管道pipe、命名管道FIFO

并且这两个文件描述符在使用的时候不需要open()打开,但是需要我们手动的close()关闭。 管道创建成功,父进程同时拥有读写两端,因为子进程是对父进程的复制,所以子进程也会拥有读写两端。...); /*拉起grep进程*/ execlp("grep", "grep", argv[1], NULL); } return 0; } 上面的程序执行...(实际上,如果父进程退出了,子进程就会被init进程收养并回收) ps进程变成僵尸进程是因为,我们在父进程中并没有回收子进程,因为execlp()函数拉起一个进程,如果执行成功,就不会再返回了,那么我们也没办法去回收这个子进程...下面,我们分析下父进程为什么没有退出,正常情况下,父进程执行完grep命令就应该正常退出的。...只能用于有血缘关系的进程间通信(父子、兄弟等有共同祖先的进程),有名管道可解决该问题。 三、FIFO命名管道 1. 什么是FIFO FIFO命名管道,也叫有名管道,来区分管道pipe。

10510
  • 并发编程~先导篇上

    ,这也就是为什么有些人为了追求效率过度调用底层,不考虑自己实际情况最后发现还不如用自托管的效率高 僵尸进程是杀不死的,必须杀死父类才能彻底解决它们,下面说说怎么让父进程为子进程‘收尸’ ---- 2.3.../master/python/5.concurrent/Linux/execl.py 之前有说fork,相当于copy了一份,.text里面放的是代码段,如果想要调用另一个程序,可以使用 execlxxx...(kbytes, -v) unlimitedfile locks (-x) unlimited 原理:算法实现的环形队列(队列:先进先出) 特点: 操作管道进程被销毁...) 验证一下3: 为什么是3开始呢?...C系列一般使用 fcntl来实现,Python进行了封装,我们可以通过 os.pipe2(os.O_NONBLOCK)来设置非阻塞管道 help(os.pipe2)Help on built-in function

    1.9K80

    进程知多少?

    Java 多线程系列文章第 1 篇 本文目录 1 进程为什么出现?...进程五态图 新进程刚创建还没有分配资源的时候是新建态,等到分配了资源,被加载就进入就绪态。当进程运行完,就从运行态进入退出态。...4.3 七态图 基于五态图,新增了 2 种挂起态,分别是就绪挂起态和阻塞挂起态。 就绪挂起态:另叫外存就绪态。由于内存容量有限,将原位于内存的就绪进程转存到外存(磁盘)上。...7.1 管道(Pipe) 管道是半双工通讯,数据是单向流动,要建立进程间互相通讯,则需要 2 个管道,这种通讯方式只能在亲戚关系的进程使用,比如父子进程。...7.2 流管道(Flow Pipe) 流管道管道进化来的,数据不再是单向流动,可以双向流动,但是依旧是只能在亲戚关系的进程使用

    67810

    linux系统编程之管道(一):匿名管道和pipe函数

    进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。 2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。 3. 父进程关闭管道写端,子进程关闭管道读端。...子进程可以往管道里写,父进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信。...,而wc 从管道里读取,现在使用dup2复制文件描述符,使ls 的标准输出为管道,wc 的标准输入也为管道,即使父进程先被调度,因为默认是阻塞I/O操作,故wc 会read 阻塞直到管道被子进程写入了数据...使用管道有一些限制: 两个进程通过一个管道只能实现单向通信,比如最上面的例子,父进程读子进程写,如果有时候也需要子进程读父进程写,就必须另开一个管道。...上面的例子是父进程把文件描述符传给子进程之后父子进程之间通信,也可以父进程fork两次,把文件描述符传给两个子进程,然后两个子进程之间通信,总之需要通过fork传递文件描述符使两个进程都能访问同一管道

    2.1K00

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

    ---- 管道使用 实例1: 单进程使用管道进行通信 注意:创建管道,获得该管道的两个文件描述符,不需要使用普通文件操作中的open操作。...注意:创建管道之后,再创建子进程,此时一共有4个文件描述符,4个端口,父子进程分别有一个读端口和一个写端口,如下图所示: #include #include <stdio.h...---- 实例3: 子进程使用execl启动新程序时管道使用 功能详情:有两个程序p1与p2,二者使用管道进行通信,p1给p2发送一个字符,p2收到打印到屏幕上。...小示例1:主进程关闭写进程,无法给子进程使用管道发送数据,此时子进程使用read函数进行数据的读取,如果 没有数据可读,则会进行阻塞,代码&结果如下所示: 解释:主进程循环5次,给子进程发送数据。...//即,此子进程使用管道的读端替换标准输入文件描述符 close(fd[0]);//关闭原来的读端 execlp(".

    63220

    1.并发编程~先导篇(上)

    其实僵尸进程的危害真的很大,这也就是为什么有些人为了追求效率过度调用底层,不考虑自己实际情况最后发现还不如用自托管的效率高 僵尸进程是杀不死的,必须杀死父类才能彻底解决它们,下面说说怎么让父进程为子进程.../master/python/5.concurrent/Linux/execl.py 之前有说fork,相当于copy了一份,.text里面放的是代码段,如果想要调用另一个程序,可以使用 execlxxx...原理:算法实现的环形队列(队列:先进先出) 特点: 操作管道进程被销毁管道自动被释放 管道默认是阻塞(读、写两端都阻塞) 管道有两个端,一个是读端(readfd,一般都为3),一个是写端(writefd...为什么是3开始呢?...C系列一般使用 fcntl来实现,Python进行了封装,我们可以通过 os.pipe2(os.O_NONBLOCK)来设置非阻塞管道 help(os.pipe2) Help on built-in

    1.5K40

    进程 · 全家桶

    进程控制块PCB:就是进程在操作系统中的“户口”,具体实现是 task_struct数据结构: 1.状态信息,例如这个进程处于可执行状态,休眠,挂起等。...但这样不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制) 使用exec族函数运行新的可执行程序。...有了exec族函数,典型打父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译链接成一个可执行程序(hello)。...主进程为父进程,fork创建了子进程在子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。...WUNTRANCED:一般用上面那个 */ 来个联系方式吧,进程间通信 常用的通信方式有:管道、消息队列、共享内存、文件空间映射。 管道:两个进程间通信,最古老的通信方式了。

    33610

    Linux进程控制

    fork系统调用的作用是复制一个进程,从而出现两个几乎一样的进程。一般来说,fork是父进程先执行还是子进程先执行是不确定的,取决于内核所实使用的调度算法。...fork()不对父子进程的执行次序作限制,而vfork()调用后,子进程先运行,父进程挂起,直到子进程调用了exec()或exit()父子进程的执行次序才不再有限制。...count的值,变为2,而父进程中count值也为2,说明父子进程共享count,即父子进程共享内存区。...vfork()创建子进程导致父进程挂起测试,vfork_test2(): #include #include #include #include...函数中含义字母l的:其参数个数不定,参数由命令行参数列表组成,最v一个NULL表示结束。 函数中含义字母v的:使用一个字符串数组指针argv指向参数列表,与含字母l的函数参数列表完全相同。

    2K30

    【Linux】万字解读<进程控制>:创建&中止&等待&替换

    fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器 决定。...——常规用法 一个父进程希望复制自己,使父子进程同时执行不同的代码段。...父进程通过 进程等待 的方式,回收子进程资源,获取子进程退出信息 有时候进程也会 等待硬件资源 ,利用wait进程等待把自己挂起 3.如何进行等待(wait&waitpid) 【1】wait函数参数与返回值介绍...参数中的…表示 可变参数 exec用于程序替换,使用要满足:(1)必须找到可执行程序(2)必须要告诉exec*,怎么执行 ,下面会有具体演示 【2】exec类函数命名规则 l(list) : 表示参数采用...#include int main() { //第一个参数,execlp带p的,可以使用环境变量PATH,无需写全路径 //后面的参数以列表形式(带l)告诉exec怎么执行

    9110

    操作系统·进程

    进程的需要 父进程常常希望考察和修改子进程或者当要协调各子进程间的活动 操作系统的需要 操作系统有时需要挂起某些进程,检查运行中资源的使用情况及进行记账,以便改善系统运行的性能。...解决办法: 我觉得解决方法已经不重要了,为什么不先反问一句:为什么会出现这种状况?这不应该是设计方面应该考虑的问题吗?...exec族 fork子进程是为了执行新程序(fork创建了子进程,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行) 使用exec族函数运行新的可执行程序...有了exec族函数,典型的父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译链接成一个可执行程序(hello)。...主进程为父进程,fork创建了子进程在子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。

    90920

    Linux笔记(10)| 进程概述

    如果进程调用了fork函数,那么父子进程同属一个进程组,父进程为首进程 在Shell中通过管道执行连接起来的应用程序,两个程序同属一个进程组,第一个程序为进程组的首进程 进程组id:pgid,由首进程...表示进程占用了系统内存的百分比 vsz:进程使用的虚拟内存大小 rss:进程使用的物理内存大小 tty:表示进程关联的终端 stat:表示进程当前状态 start:表示进程的启动时间 time:记录进程运行的时间...,有读端和写端(管道是单向通信的) (2)管道通信的方法:父进程创建管理fork子进程,子进程继承父进程管道fd (3)管道通信的限制:只能在父子进程间通信、半双工 (4)管道通信的函数:pipe、...write、read、close 有名管道(fifo) (1)有名管道的原理:实质也是内核维护的一块内存,表现形式为一个有名字的文件 (2)有名管道使用方法:固定一个文件名,2个进程分别使用mkfifo...创建fifo文件,然后分别open打开获取到fd,然后一个读一个写 (3)管道通信限制:半双工(注意不限父子进程,任意2个进程都可) (4)管道通信的函数:mkfifo、open、write、read、

    67610

    进程间的通信

    文章目录 1、进程间通信 (1)概述 (2)我们为什么需要进程间通信 (3)进程间通信的8种方法 1、无名管道通信 2、高级管道通信 3、有名管道通信 4、消息队列通信 5、信号量通信 6、信号 7、共享内存通信...因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。...(2)我们为什么需要进程间通信 有这个进程间通信这个概念或者说是功能的出现,就代表一定有它该出现的理由。例如药的出现就是为了治疗疾病,超级笔记本的出现就是为了解决普通笔记本厚重的问题。...(3)进程间通信的8种方法 1、无名管道通信 无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程使用进程的亲缘关系通常是指父子进程关系。...(4)无名管道和有名管道的联系和区别 1、联系 通信数据只存在于内存缓冲页面中; 都是半双工通信; 2、区别 无名管道是无名的,有名管道是有名的; 无名管道只能用于父子进程或兄弟进程之间的通信,而有名管道可用于任意两进程之间通信

    73531

    《Linux操作系统编程》 第六章 Linux中的进程监控: fork函数的使用,以及父子进程间的关系,掌握exec系列函数

    理解:Linux进程创建时环境变量、命令行参数的设置,理解父进程等待子进程结束和获得子进程返回值的原理; 掌握:fork函数的使用,以及父子进程间的关系,掌握exec系列函数。...▪ I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。...- clone():由标志CLONE_VFORK 来决定子进程在执行时父进程是阻塞还是运行,若没有设置该标志,则父子进程同时运行; 若设置了该标志,则父进程挂起,直到子进程结束为止。...exit 和_exit执行完把控制权交给内核。 ▪ return是函数执行完的返回。renturn执行完把控制权交给调用函数。...键. kill -1 PID 先挂起进程, 终止子进程, 完成善后工作, 再终止该进程. kill -9 PID 立即强行终止该进程, 不作任何善后工作.

    17310

    【Linux进程控制】四、exec函数族——进程替换详解

    进程替换的概念 我们在使用fork()系统调用之后,创建出来的子进程是对父进程的复制,也就是说子进程和父进程执行的是相同的程序,虽然说父子进程可能执行的是不同的代码分支(if else语句),但是程序流程是一样...这里面重要的是前两个execl和execlp函数,它们都用于使用一个新的进程去替换原来的进程,也就是在新创建的进程中执行其他程序。...execlp中的p是指PATH环境变量,在执行程序的时候execlp使用PATH环境变量,这样在执行程序的时候就可以不用加路径了,因为它使用了环境变量PATH,通过这个环境变量就能够找到路径,而execl...\n"); return 0; } 这样我们在执行exec_test程序的时候会被直接替换为 ls -lrt 进程,并且我们的测试语句printf没有打印,这说明execlp()函数执行成功不会返回...实际上shell是先fork()一个进程,然后在fork()创建的子进程使用exec函数来拉起一个其它进程,这样fork()的两个进程有一个是shell进程,一个是我们需要执行的进程,这才是exec

    14310

    Linux的进程线程及调度

    管道是在亲属进程(同一父进程创建出的进程)之间进行数据传输的。 3) 命名管道FIFO 命名管道可用于在无亲属关系之前是进程间通信。...2.1 fork() 执行fork,父进程的task_struck对拷给子进程父子进程最初资源完全一样,但是两份不同拷贝,因此任何改动都造成二者的分裂。 ?...父子进程对内存资源(mm)的管理使用了COW(Copy-On-Write, 写时拷贝)技术: 1) 在fork之前,一片内存区对应一份物理地址和一份虚拟地址,内存区的权限的RW; 2) 在fork之后...,父子进程看到的内存区虚拟地址相同,物理地址也相同,父子进程使用的其实是同一片物理内存,未发生内存拷贝,操作系统会将此内存区权限改为RO; 3) 父或子进程对内存区执行写操作将触发PageFault,...无MMU的CPU使用vfork创建进程,父进程将一直阻塞直到子进程exit或exec。 vfork和fork的本质区别是,vfork中的父子进程共用同一片内存区。

    4.1K41

    UNIX(进程间通信):08 管道通信

    匿名管道 匿名管道进程间通信中比较简单的一种,他只用于有继承关系的进程,因为匿名,非继承关系的进程无法找到这个管道,也就无法完成通信,而有继承关系的进程,是通过fork出来的,父子进程可以获得得到管道...进一步来说,子进程可以使用继承于父进程的资源,但是他无法使用叔伯进程的资源。管道通信的原理如下: ? 父子进程通过fork,子进程继承了父进程的文件描述符。所以他们指向同一个数据结构。...父子进程通常只需要单向通信,父子进程各关闭自己的一端。当父子进程管道进程读写的时候,操作系统会控制这一切,包括数据的读取和写入,进程挂起和唤醒。...利用管道进行父子进程通信 图片解析原理 ?...命名管道 我们刚刚可以用匿名管道父子进程之间通信,那如果是两个不想光的进程之间该如何通信呢?

    1.1K20

    温故Linux后端编程(二):进程

    exec族 fork子进程是为了执行新程序(fork创建了子进程,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行) 使用exec族函数运行新的可执行程序...有了exec族函数,典型的父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译链接成一个可执行程序(hello)。...主进程为父进程,fork创建了子进程在子进程中exec来执行hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。...execle *l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志 *e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境 */...execve * v 希望接收到一个以NULL结尾的字符串数组的指针 * e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境 */ if( fork

    70520

    Linux-Copy On Write写时复制机制初探

    高可用HA软件中广泛使用。...(函数族exec( )是一组函数的统称, 它包括了execl()、execlp()、execv()、execle()、execve()、execvp()等) fork fork是类Unix操作系统上创建进程的主要方法...exec函数族不止一个,但它们大致相同,在 Linux中,它们分别是:execl,execlp,execle,execv,execve和execvp。...---- 为什么有了COW? 早期的 Unix 在实现 fork 系统调用时,并没有使用该技术,创建新进程的开销很大。...现在Linux的fork()使用写时拷贝页来实现新进程的创建,它是一种可推迟甚至避免数据拷贝的技术,刚开始时内核并不会复制整个地址空间,而是让父子进程共享地址空间,只有在写时才复制地址空间,使得父子进程都拥有独立的地址空间

    3.4K10
    领券