Linux 父子进程在没有同步时出现的问题

    今天想熟悉下匿名管道,于是在Linux上写了一个简单的程序,其中父进程与子进程之间通过匿名管道进行通信,父进程使用fork创建一个子进程,使用管道的写端,并关闭管道的读端;子进程使用管道的读端,关闭管道的写端。

    如果没有父子进程的同步,则父进程与子进程的运行没有先后顺序,然而,管道必须先有写,然后才能读。如果子进程先运行,父进程还没有对管道进行写操作,则子进程读管道则会出现错误,导致通信失败~~如果父进程先运行,并进行了写操作,则子进程运行时,可以读管道~~

    在父进程先运行,子进程后运行这种情况下,在Shell中运行可执行文件时,父进程输出后,Shell提示符出现了,然后才是子进程的输出~~为什么这里Shell提示符会出现呢?

    可以这样理解:shell运行每一个可执行文件,相当于运行一个作业,作业可能是一个进程也可能是多个进程(多个进程构成进程组),一个作业可以有一个前台进程组和任意数量个后台进程组,然而,作业中的进程只包括由Shell产生的进程,不包括进程fork后产生的子进程,可以参考博文《Linux 进程组,作业,会话的理解》,当作业运行完毕,前台进程组可能没有运行完毕,因为前台进程产生的子进程可能还存在,但它不属于作业,前台进程组会转为后台,Shell提示符会变前台,所以会看到父进程输出后(子进程还没有运行完毕),Shell提示符会出现。子进程转为后台后,但它还拥有控制终端(只有守护进程没有控制终端,可以参考博文《Linux 守护进程》),所以也会输出到终端,从而出现上面提到的现象~

    通过同步父子进程,可以避免上述现象的出现~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值