python os.fork(),有关子进程入口的疑问

2016-10-28 11:43:07 +08:00
 wisefree

请大家帮忙看看,>_< python3 代码如下,运行环境 ubuntu12.04 virtualbox 虚拟机

import os

print('inlet is here of main process')

pid = os.fork()

if (pid ==0):
    print('child pid is running')
else:
    print('main pid is running')

主进程的入口时 import os 子进程得到了主进程的所有代码,有了自己的空间,为什么入口不是 import os ,而是从 os.fork()以下执行呢?

附图如下: http://a3.topitme.com/9/cf/f7/1177624584b1af7cf9o.jpg

2987 次点击
所在节点    Python
15 条回复
EchoUtopia
2016-10-28 11:48:50 +08:00
。。设定就这样吧,如果从头那岂不是无限fork?
raysonx
2016-10-28 11:50:45 +08:00
建议楼主看一下 Unix 的 fork 系统调用。
简单来说:操作系统这一层就是这么设计的,操作系统才不关心你的 Python 文件,那是 Python 解释器关心的东西,不在一个层次上
sujin190
2016-10-28 11:57:08 +08:00
你应该去看看 linux 的 fork ,既然是 fork ,自然除了所有代码数据外还包含所有状态了,锁,文件句柄,函数调用栈
enenaaa
2016-10-28 12:58:16 +08:00
fork 是拷贝,包括内存数据和执行环境,只能说类 linux 设计有点奇葩。
多进程考虑用 multiprocessing 啊,这个比较方便。
nicegoing
2016-10-28 13:03:47 +08:00
前面都有运行结果了,把主进程的结果直接拷贝给子进程。如果子进程还去跑前面的代码岂不是傻?
BOYPT
2016-10-28 13:18:31 +08:00
楼主你想要的是 os.system(__FILE__)吧
wisefree
2016-10-28 13:23:30 +08:00
@raysonx 谢谢提醒!我会去看看的
wisefree
2016-10-28 13:23:47 +08:00
@EchoUtopia 额,其实我也是这样困惑的。。
wisefree
2016-10-28 13:28:56 +08:00
@sujin190
@enenaaa
确实如此,针对 linux fork , google 了一下,
>fork 英文意思:分支, fork 系统调用复制产生的子进程与父进程(调用进程)基本一样:代码段+数据段+堆栈段+PCB ,当前的运行环境基本一样,所以子进程在 fork 之后开始向下执行,而不会从头开始执行。
>https://www.cnblogs.com/mickole/p/3186441.html

以后还是用 multiprocessing>_<
wisefree
2016-10-28 13:31:53 +08:00
@BOYPT 这个是啥,没见到过,粘贴到代码里运行不了。。。
> NameError: name '__FILE__' is not defined
BOYPT
2016-10-28 13:33:56 +08:00
@wisefree 记混了,__FILE__是 PHP 的, py 的应该是__file__,当前代码文件路径
msg7086
2016-10-28 23:51:22 +08:00
克隆哪来的入口。
启动新的应用程序才是从入口继续。
克隆的话是一份程序变成两份一模一样的,当然两个程序都会从 fork()返回了。
firstway
2016-10-29 06:52:47 +08:00
楼上说的对, fork 完全是动态的,就在 call fork 那里分离, OS 复制成 2 个进程,分离后都从那一点各自跑各自的。他们共享执行指令,但是是不同的执行流(也就是不同的进程),这也是为什么要通过返回值 pid 来运行不同的逻辑。
一定要分清,他们指令完全一样的(指令是死的),执行流一般是不一样,是动态的。
在分离之初,内存其实几乎一样的,可以想象 2 个指针指向同一块内存。随着执行流的区别, OS 会对内存进行 copy on write 的操作,慢慢内存也各种写各自的。
wisefree
2016-10-29 19:20:03 +08:00
@msg7086
受教了,谢谢!
wisefree
2016-10-29 19:20:18 +08:00
@firstway
:),感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/316142

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX