Discuss / Python / 完全没看懂第一个例子,请问谁能帮忙解读一下?

完全没看懂第一个例子,请问谁能帮忙解读一下?

Topic source

这是廖大的例子

import os

print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
    print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
    print('I (%s) just created a child process (%s).' % (os.getpid(), pid))



运行结果如下:

Process (876) start...
I (876) just created a child process (877).
I am child process (877) and my parent is 876.

请问大家运行结果为什么是这样啊?我有两个疑问:

1. if else不是应该只返回一个结果吗?为什么这里两句话都被print出来了呢?

2. os.getpid()到底应该返回什么值?

print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

里面的os.getpid()是父进程876

print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())

里面的os.getpid()是子进程877

使用fork创建子进程后,子进程会复制父进程的数据信息,而后程序就分两个进程继续运行后面的程序

pid = os.fork() 这一行开始执行了父子两个进程,自然也就打印了两次,
os.getpid()    获取当前进程的进程ID
os.getppid()   返回父进程的ID

普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

理解一下这句话,我也是菜鸡

谢谢!我觉得我好像有点懂了,请问是这样理解吗?

fork()是一个很特殊的函数,调用一次,可以返回两次。先返回父进程,再返回子进程。所以先执行 

print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

再执行

print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))

其中呢,os.getpid()用于获得当前进程,在父进程里就是876,在子进程里是877。

我还有一个问题,pid = os.fork() 到底返回什么呢?廖大说子进程永远返回0,而父进程返回子进程的ID。但是print出来的时候,pid是子进程877,并不是0?

安迪博德

#5 Created at ... [Delete] [Delete and Lock User]

我还有一个问题,pid = os.fork() 到底返回什么呢?廖大说子进程永远返回0,而父进程返回子进程的ID。但是print出来的时候,pid是子进程877,并不是0?

  1. os.fork(),对子进程返回的就是0,否则不可能进if分支。

  2. os.getpid(),返回进程自身的进程id,父子进程都能用。

我还有一个问题,pid = os.fork() 到底返回什么呢?廖大说子进程永远返回0,而父进程返回子进程的ID。但是print出来的时候,pid是子进程877,并不是0?

实操os.fork()返回两个值,第一个值为父进程返回的子进程ID,第二个值为子进程返回的0。

if…else...的判断,第一个值判断if不成立,输出else的内容,其中os.getpid()为当前进程ID=父进程ID,pid为父进程返回的子进程ID。

第二个值判断if成立,输出if的内容,其中os.getpid()为当前进程ID=子进程ID,os.getppid()为当前进程父进程ID。

谢谢大家的详细解答!终于看懂这个例子了。

fork()是一个很特殊的函数,调用一次,可以返回两次。先返回父进程,再返回子进程。所以先执行 

并不是先返回父进程在返回子进程,进程调度是操作系统决定的,千万不要在代码里假定哪个先执行(来自廖老师)

比如在父进程中加入休眠,子进程就会先执行

新一仔

#9 Created at ... [Delete] [Delete and Lock User]

它返回的是它創建出的子進程的id,子進程裡這個返回值為0。這裡是操作系統的知識,出現两個print是因為有两個進程,各自進行了一次print.


  • 1

Reply