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

Fork进程后,是否与父进程共享stdio?

今天想到一个问题:如果我在代码里面,fork当前进程,然后两个进程都执行scanf(),那会发生什么?键盘输入的数据是定向到哪个进程呢?...scanf("%c\n", &c); printf("parent process: %c\n", c); } } } 根据上面这串代码,父进程和子进程都会调用...运行之后,当我在控制台输入字符,输出如下: running... parent process, child=33781 2 parent process: 2 parent process: 3...process: 4 child process: 5 parent process: 5 parent process: 6 child process: 6 child process: 可以看到,父进程和子进程都读取了键盘的数据...具体是哪一个进程获取到数据,则与进程调度有关。这提醒了我一点:多个进程同时读取同一个stdin的话,会造成获取到的数据不完整的问题。(这与stdin默认为tty这样的字节设备的特性有关)

17220

linux系统编程之进程(四):waitwaitpid函数与僵尸进程、fork 2 times

调用wait或者waitpid函数查询子进程退出状态,此方法父进程会被挂起(waitpid可以设置不挂起)。...如果不想让父进程挂起,可以在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);表示父进程忽略SIGCHLD信号,该信号是子进程退出的时候向父进程发送的。...也可以不忽略SIGCHLD信号,而接收在信号处理函数中调用wait/waitpid。 // 让子进程退出后自动回收,避免成为僵尸或者需要父进程 wait。...在一个子进程终止前, wait 使其调用者阻塞,而waitpid 有一选择项,可使调用者不阻塞。 waitpid并不只能等待第一个终止的子进程—它有若干个选择项,可以控制它所等待的特定进程。...Son 在创建  Grandson 后立即返回,并由主进程 waitpid回收掉。而真正的目标 Grandson 则因为 "生父" Son 死掉而被 init 收养,然后直接被人道毁灭。

3.3K70
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    生产环境调用google-chrome工具渲染pdf进程挂起分析

    问题描述:客户生产环境某台机器在接收到交易请求,执行通过脚本调用google-chrome访问页面渲染生成pdf过程时,前端交易无应答直到超时异常;问题分析:1.对于这个交易过程,通过业务实现来分析,其链路如下...,所以需要关注这个插件的执行过程发生了什么问题;3.首先通过Linux中,系统中检查后端应用派生出的子进程,有许多google-chrome工具生成的子进程未正常结束:4.对于linux中的进程挂起,我们通常使用...strace工具检查进程阻塞在什么地方了(strace -v -tt -T -p 进程ID):5.无法直观分析上下文的调用过程,经过针对google-chrome分析其使用原理,为chrome的后端针对...URL渲染页面生成PDF的过程,不需要有浏览器视图的访问,是通过java后台调用插件工具,在后台进行页面的渲染后将页面写成pdf文件格式;6.在进程执行的挂起命令可以模拟java,进行手动调用过程,来通过...的访问是得到了应答的,说明目前的生产环境这个服务存在问题,无应答,导致进程一直在等待,从而无法完成后续任务,所以在测试环境进行复现,但是发现测试环境根本没有这个访问过程,没有去去读/root/.Xauthority

    39550

    Linux僵尸进程

    一旦它的父进程是一个循环,不会结束(父进程不去调用wait函数或者waitpid函数)。那么子进程将会一直保持僵尸状态。那么它将一直占用进程号,系统就没法回收利用。...当一个父进程以fork()系统调用建立一个新的子进程后,核心进程就会在进程表中给这个子进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。...如何避免僵尸进程: 可以在父进程中通过调用wait()和waitpid函数等待子进程结束,但是这会导致父进程挂起。 父进程不能挂起,父进程要做的工作很多,很忙。...那么可以使用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在headler中使用wait函数来回收子进程。...但是子进程的回收仍旧需要父进程来做,好处是不用使用wait()来挂起了,父进程可以忙自己的。 使用wait函数和waitpid函数。

    4.5K20

    Linux僵尸进程以及wait函数

    一旦它的父进程是一个循环,不会结束(父进程不去调用wait函数或者waitpid函数)。那么子进程将会一直保持僵尸状态。那么它将一直占用进程号,系统就没法回收利用。...当一个父进程以fork()系统调用建立一个新的子进程后,内核就会在进程表中给这个子进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。...同时我们另开一个终端,输入top命令,将会看有一个僵尸进程存在。 如何避免僵尸进程: 可以在父进程中通过调用wait()和waitpid函数等待子进程结束,但是这会导致父进程挂起。...但是子进程的回收仍旧需要父进程来做,好处是不用使用wait()来挂起了,父进程可以忙自己的。 使用wait函数和waitpid函数。...在代码中设置了选项 WNOHANG,而调用中 waitpid() 发现没有已退出的子进程可等待,返回0。所以取到的子进程的PID是0,说明子进程在运行,还未结束。

    1.8K10

    【Linux进程控制】五、wait()函数——子进程回收

    ID在3秒后变成了1,这说明父进程结束后,它变成了孤儿进程,并被init进程收养,使用kill命令基于可以杀死孤儿进程。...这个进程的父进程可以调用wait()或者waitpid()来获取这些信息,然后彻底清除这个进程。我们知道,一个进程的退出状态可以在shell中用特殊变量$?...查看,因为shell进程是它的父进程,当它终止的时候shell调用wait()或waitpid()得到它的退出状态,同时彻底清除这个进程。...()函数还会产生僵尸进程呢,这是因为在waitpid()函数中使用了选项参数WNOHANG,而子进程中有一个睡眠函数,子进程睡眠的时候,父进程中waitpid()语句没有等到子进程结束就执行了,由于WNOHANG...当waitpid()返回父进程中后,子进程才结束,但是waitpid()已经执行完了,所以并没有回收子进程,子进程因此变成僵尸进程。

    10410

    僵尸进程

    1.什么是僵尸进程?     UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,而父进程还没有结束,那么他将变成一个僵尸进程.    ...任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。...    1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起     2....如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收     3....如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号     4.

    1.4K50

    和老李一起搞山寨Workerman(三)

    僵尸进程:子进程完成其生命周期后,父进程任之不管不管,子进程残留数据诸如PID、持有的资源等,久而久之则危害操作系统。在*NIX系统中,僵尸进程常有[Z+]标志符。...下面的程式向我们表述了[ 一个生命周期为10s中的子进程在结束后被主进程通过pcntl_wait()回收 ]的简要流程: 进程,而pcntl_wait()函数在成功回收了子进程后,该函数当即会返回被回收子进程的PID。 ?...pcntl_wifstopped:此君用于检测子进程是否已停止(注意停止不是终止,诸君要理解为临时挂起),然需使用了WUNTRACED作为$option的pcntl_waitpid()函数调用产生的status...[ 篇后不可错过之深思:正如上图所示,在kill -STOP 21098后,诸君可曾尝试kill -CONT 21098?

    1.1K61

    UNIX(进程间通信):03---僵尸进程

    怎样产生僵尸进程 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit, 它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程...它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD 信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了, 那么...怎样来清除僵尸进程 改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后, 会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。...避免僵尸进程的方法 ⒈父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。...⒉ 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。

    73130

    你知道如何用 PHP 实现多进程吗?

    pcntl_fork ( void ) : int这个函数的作用是创建子进程,并且返回 int 类型的进程 ID,父进程和子进程都是从 fork 的位置开始向下继续执行。...子进程创建成功时,在父进程执行线程内返回产生的子进程的 PID,在子进程执行线程内返回 0。创建失败时,在父进程上下文返回 - 1,不会创建子进程,并且会引发一个 PHP 错误。...此函数会挂起当前进程的执行,直到一个子进程退出或者受到一个信号要求中断当前进程或者调用一个信号处理函数。如果一个子进程在调用此函数时已经退出,此函数立刻返回。...调用这个函数会挂起当前进程的执行,直到参数 pid 指定的进程号的进程退出,或者接收到一个信号要求中断当前进程或调用一个信号处理函数。...pcntl_waitpid () 返回退出的子进程进程号,发生错误时返回 - 1, 如果提供了 WNOHANG 作为 option,并且没有可用子进程时返回 0。

    41020

    僵尸进程与孤儿进程

    这样设计的目的主要是保证只要父进程想知道子进程结束时的状态信息,就可以得到 僵尸进程: 一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息...危害 僵尸进程虽然不占有任何内存空间,但如果父进程不调用 wait() / waitpid() 的话,那么保留的信息就不会释放,其进程号就会一直被占用,而系统所能使用的进程号是有限的,如果大量的产生僵死进程...解决僵尸进程方案 (1)方案一: 父进程通过 wait 和 waitpid 等函数等待子进程结束,但这会导致父进程挂起,所以这并不是一个好办法,父进程如果不能和子进程并发执行的话,那我们创建子进程的意义就没有...同时一个 wait 只能解决一个子进程,如果有多个子进程就要用到多个 wait (2)方案二:通过信号机制: 子进程退出时,向父进程发送 SIGCHILD 信号,父进程处理 SIGCHILD 信号,在信号处理函数中调用...具体操作为:父进程一次 fork() 后产生一个子进程随后立即执行 wait(NULL) 来等待子进程结束,然后子进程 fork() 后产生孙子进程随后立即exit(0)。

    29050

    Linux内核编程--进程控制,线程控制,锁机制

    若失败,返回-1 fork函数被调用一次,但是有两次返回:子进程返回0,父进程返回子进程的进程ID。 子进程可以调用getppid()函数获得父进程的进程ID。...vfork与fork的区别是,vfork并不将父进程的地址空间完全复制到子进程中。 vfork创建子进程后,子进程先运行,子进程调用exec或exit后,父进程再开始被调度运行。...父进程调用wait/waitpid后会被挂起,直到子进程终止运行并将退出状态返回给父进程。 父进程也可以通过wait/waitpid来检验子进程是否已经运行结束。...*cmdstring) system调用fork产生子进程, 由子进程来执行shell脚本cmdstring, 此命令执行完后返回到原调用的父进程。...system函数在系统中的实现:system函数执行时,会调用fork、execve、waitpid等函数。

    1.2K20

    python 学习笔记day10-pyt

    系统中使用非常广泛             当某一命令执行时,父进程(当前进程)fork出一个子进程             父进程将自身资源拷贝一份,命令在子进程中运行时,就具有和父进程完全一样的运行环境...chdir.sh 3/4命令是一样的         进程的生命周期              父进程fork子进程并挂起             子进程运行完毕后,释放大部分资源并通知父进程...fork子进程,子进程负责ping        使用轮询解决zombie问题             父进程通过os.wait()来得到子进程是否终止的信息             在子进程终止和父进程调用...查看stat  工作过程: 父进程,子进程分别运行,父进程sleep 30 s,子进程sleep 10s,父进程没有处理子进程的代码,子进程进入zombie状态,父进程sleep后,init进程回收父进程资源...waitid()接受两个参数,第一个参数设置为-1,表示与wait()函数相同;第二个参数如果设置为0表示挂起父进程,直到子进程退出,设置为1表示不挂起父进程             waitpid()

    81830

    Linux并发(进程的生老病死)

    4,进程处于“执行态”时,可能会由于某些资源的不可得而被置为“睡眠态/挂起态”,比如进程要读取一个管道文件数据而管道为空,或者进程要获得一个锁资源而当前锁不可获取,或者干脆进程自己调用sleep( )来强制自己挂起...比如上图中,在main函数内return或者调用exit(),包括在最后线程调用pthread_exit()都是正常退出,而受到致命信号死掉的情况则是异常死亡,不管怎么死,最后内核都会调用一个叫do_exit...7,父进程调用wait()/waitpid()来查看孩子的“死亡信息”,顺便做一件非常重要的事情:将该孩子的状态置为EXIT_DEAD,即死亡态,因为处于这个状态的进程的PCB才能被系统回收。...由此可见,父进程应该尽职尽责地及时调用wait()/waitpid(),否则系统会充满越来越多的“僵尸”!...问题是,如何保证父进程一定要及时地调用wait()/waitpid()从而避免僵尸进程泛滥呢?

    1.3K20

    从 0 到 1 优雅的实现PHP多进程管理

    备注:下文中,父进程统称为master,子进程统称为worker。...master有调用 pcntl_wait或者 pcntl_waitpid函数,为什么呢?...首先我们在这里得提到两个概念,如下: 孤儿进程:父进程挂了,子进程被pid=1的init进程接管(wait/waitpid),直到子进程自身生命周期结束被系统回收资源和父进程采取相关的回收操作 僵尸进程...:子进程exit退出,父进程没有通过wait/waitpid获取子进程状态,子进程占用的进程号等描述资源符还存在,产生危害:例如进程号是有限的,无法释放进程号导致未来可能无进程号可用 所以, pcntl_wait...或者 pcntl_waitpid的目的就是防止worker成为僵尸进程(zombie process)。

    1.5K110

    C语言进程(第二章,wait,sleep,waitpid,pthread_mutex_lock,pthread_mutex_unlock)

    很重要的一点:在使用wait函数等待子进程时,通常应该确保只有需要等待的子进程都结束运行后,再继续执行父进程的其他任务,否则会出现资源泄漏和错误码乱窜等情况。...当调用 sleep() 函数时,操作系统会阻止程序的继续执行并暂停程序的运行时间。 在等待所需时间后,函数返回以便程序可以恢复执行。...同时,进程的挂起会降低资源利用率,在开发实际需求中也需要谨慎使用_SLEEP()函数来保证系统性能和稳定性。...如果我们在访问共享内存、文件、网络等资源时对其进行加锁或使用其他同步机制就可以更好地解决这种问题。 例题二 编写一个程序,父进程创建5个子进程,并等待每个子进程完成后,计算并输出它们的运行时间。...运行结果: 当该代码运行时,父进程重复调用了五次waitpid()函数来等待每个子进程完成操作,并处理相应的返回状态。 当一个子进程执行完毕后,它退出并返回一个退出状态码给父进程。

    8910

    C语言 进程

    如果子进程被调度执行了,从内核返回后就从fork函数返回,保存在变量pid中的返回值是0,子进程仍可以调用getpid函数得到自己的进程id,也可以调用getppid函数得到父进程的id。...exec函数用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。...这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。若调用成功则返回清理掉的子进程id,若调用出错则返回-1。...这两个函数的区别是:如果父进程的所有子进程都还在运行,调用wait将使父进程阻塞,而调用waitpid时如果在options参数中指定WNOHANG可以使父进程不阻塞而立即返回0。...可见,调用wait和waitpid不仅可以获得子进程的终止信息,还可以使父进程阻塞等待子进程终止,起到进程间同步的作用。

    1.2K10

    异步编程举例之闹钟程序

    用户输入的信息第一部分是闹钟等待时间(以秒为单位),第二部分是闹钟时间到达后所显示的信息。 一 同步版本 创建Qt控制台程序,由于闹钟程序是c语言的,需要包含如下2个头文件。...成功解析字符串后,延时、打印信息。 缺点:一次只能处理一个闹钟请求。实际上是把希望用异步方式实现的工作用同步方式实现了。 二 多进程版本 有多种异步实现该程序的方法。...其中一种方式是为每个命令使用fork调用生成一个子进程。这样可以随时输入命令行,彼此独立运行,不会阻塞等待。程序难点在于对子进程的资源回收,不做重点说明。...成功解析输入信息后,创建子进程延时、显示信息。父进程则等待子进程结束并回收资源,通常是调用某个waitpid函数。 WNOHANG属性使父进程不必挂起等待子进程结束。...如果有子进程终止,则waitpid ()函数回收子进程资源,如果没有子进程结束,该函数立即返回0。父进程继续回收终止的子进程直到没有子进程终止。 程序运行结果如图: ?

    76330
    领券