当在我的 Linux 系统中执行ps
命令时,我看到一些用户进程两次(不同的 PID...)。我想知道它们是新进程还是同一进程的线程。我知道标准 C 库中的一些函数可以创建一个新进程,例如fork()
.我想知道当我执行命令时哪些具体函数可以使进程出现两次,ps
因为我正在查看创建新进程或线程的源代码。
答案1
有点令人困惑。fork
是一个系统调用,它通过复制父进程的映像来创建新进程。之后,如果子进程想要成为另一个程序,它会调用一些exec
家族系统调用,例如execl
.例如,如果您想ls
在 shell 中运行,shell 会分叉新的子进程,然后调用execl("/bin/ls")
.
如果您看到两个程序并且它们pid
的 不同,请检查它们ppid
的(父 ID)。例如,如果p1
is ppid
of process who pid
is p2
,则表示 id 是p1
该进程的 fork 的进程。但是如果第一个进程'ppid
与另一个进程'不同pid
,则意味着相同的命令被执行了两次。
如果pid
和ppid
相同,但tid
s(线程 ID)不同,则表示是一个进程有 2 个线程。
我认为制作自己的 shell 是一个很好的起点。