Python 为什么'os.getpid'在Windows上返回负pid?

Python 为什么'os.getpid'在Windows上返回负pid?,python,windows,operating-system,pid,spawn,Python,Windows,Operating System,Pid,Spawn,我记得不久前,有人问我这里的Windows有负PID,我再也找不到这个问题了。在所有情况下,我都从学习Python第四版中看到了一些代码,其中包含负进程ID,所以让我们先看看代码: #spawnv.py import os, sys for i in range(10): if sys.platform[:3] == 'win': pypath = sys.executable os.spawnv(os.P_NOWAIT, pypath, ('pytho

我记得不久前,有人问我这里的Windows有负PID,我再也找不到这个问题了。在所有情况下,我都从学习Python第四版中看到了一些代码,其中包含负进程ID,所以让我们先看看代码:

#spawnv.py
import os, sys

for i in range(10):
    if sys.platform[:3] == 'win':
        pypath = sys.executable
        os.spawnv(os.P_NOWAIT, pypath, ('python', 'child.py', str(i)))
    else:
        pid = os.fork()
        if pid != 0:
            print('Process %d spawned' % pid)
        else:
            os.execlp('python3', 'python3', 'child.py', str(i))
print('Main process exiting.')

以及书中提到的输出:

Hello from child −583587 0
Hello from child −558199 2
Hello from child −586755 1
Hello from child −562171 3
Main process exiting.
Hello from child −581867 6
Hello from child −588651 5
Hello from child −568247 4
Hello from child −563527 7
Hello from child −543163 9
Hello from child −587083 8
我在Windows7上运行了完全相同的代码,所有生成的进程都有积极的PID。
P_NOWAIT
标志用于
spawnv
的事实使它更令人困惑
P_WAIT
可以返回一个否定的状态代码:
-信号


是打字错误还是Windows可能有负面PID?

Windows上的
PID
始终大于
0
,并将根据需要存储为
uint32
。因此,实际的
PID
为负值没有多大意义

在我的理解中,负PID通常用于表示这不是一个真正的进程,而是一个
伪进程
/
线程
()。所以这可能是解决方案的一部分。@FlashTek也许这就是以前使用线程实现它的方式。但是在线程上使用
exec
将取代Linux中的整个进程。您没有打印或使用
os.spawnv
返回的值。打印的PID来自子进程中的调用
os.getpid()
。Python在这里使用有符号的值,即C实现调用
PyLong\u FromLong(getpid())
,但要获得-583587,无符号的PID必须是4294383709。这一数字的巨大规模使可信度受到影响。此外,它不是Windows上进程或线程ID的4倍(实现细节,但是稳定的)。您运行的Python版本比本书中的版本更新(毕竟已经有将近8年的历史了),而实现fork/exec的方式正好不同。作者甚至可能正在运行Python的Cygwin版本,而不是本机Windows版本。我不记得在那种情况下典型的PID值是多少。它可能只是0x7FFFFFFF之上的内核地址,在这种情况下,负值是正确的。
Hello from child −583587 0
Hello from child −558199 2
Hello from child −586755 1
Hello from child −562171 3
Main process exiting.
Hello from child −581867 6
Hello from child −588651 5
Hello from child −568247 4
Hello from child −563527 7
Hello from child −543163 9
Hello from child −587083 8