- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个 python 代码,其中一个进程使用 fork()
创建另一个进程。在子进程中,我想使用 execlp()
打开另一个进程。
我在子进程中打开的程序显示EOF 错误。我不明白为什么,因为当我尝试单独运行该子程序时,它没有显示任何错误。
对于主要过程,Python 代码是
import os
def main():
pid=os.fork()
if pid==0:
os.execlp("python3", "python3", "child1.py")
else:
print("I am parent")
main()
对于子进程的代码是
def main():
a=input("enter a no : ")
print("I am child "+str(a))
main()
我打开主程序或者父进程得到的输出是
I am parent
debesh@laptop:~/Documents/programs/python/parallel_processes$ enter a no : Traceback (most recent call last):
File "child1.py", line 5, in <module>
main()
File "child1.py", line 2, in main
a=input("enter a no : ")
EOFError
最佳答案
child 试图在其 parent 去世后从终端读取。这不起作用,因为子进程不再位于前台进程组中。
好的,什么是前台进程组?基本思想是 process group同一 shell 作业中的一组进程。当您从终端中的 shell 运行程序时,shell 会为该程序创建一个进程组。如果程序 fork ,则子进程属于同一个进程组。如果您在后台运行该程序 (myprogram &
),进程组是一个 background process group ;如果你在前台运行程序(没有&
)那么进程组是foreground process group (只能有一个前台进程组)。 shell 命令fg
和bg
可以将进程组带入前台或后台。进程组用于两件事:您可以将它们一起发信号,它们决定允许谁访问终端。
只允许前台进程组从终端读取。如果后台进程试图从终端读取,read
系统调用返回 EIO
。这是一个用户界面设计决策:当用户在前台与程序交互时,后台进程不会中断它。
让我们让子进程打印有关其进程组的信息:
#!/usr/bin/python3
import os
def main():
print("Child: pid={pid:d} ppid={ppid:d} pgid={pgid:d}".format(pid=os.getpid(), ppid=os.getppid(), pgid=os.getpgrp()))
a=input("enter a no : ")
print("I am child "+str(a))
main()
示例输出:
$ ./parent.py
I am parent
$ Child: pid=15593 ppid=1 pgid=15592
enter a no : Traceback (most recent call last):
File "child1.py", line 7, in <module>
main()
File "child1.py", line 5, in main
a=input("enter a no : ")
EOFError
子进程组还是父进程ID,但是父进程已经死了(所以现在子进程的父进程ID为1)。因此, child 现在处于自己的进程组中。由于它不在前台(shell现在回到前台), child 在后台,所以它无法访问终端。
对比如果在 print("I am parent")
之前添加对 os.wait()
的调用会发生什么:
$ ./parent.py
Child: pid=15619 ppid=15618 pgid=15618
enter a no : hello
I am child hello
I am parent
这次子进程还在前台进程组中,所以它可以正常访问终端。
我不知道为什么 Python 将错误报告为 EOFError
而不是 IOError
。
关于python - 如果我在子进程中输入一些内容,fork 和 exec 组合将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28645598/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!