如何使用pid
确定某个流程是否是另一个流程的子/孙?
答案 0 :(得分:7)
所有正在运行的程序都有唯一的进程ID。该 process ID,a 非负整数,是进程的唯一标识符 总是独一无二。但是,进程ID可以重复使用。
当进程终止时,其ID可以重用。某些 系统延迟重用,以便不会混淆新创建的进程 与旧的。
某些ID是"保留"从他们被使用的意义上来说 系统进程,例如 scheduler 进程。另一个例子是 始终占用PID的 init 进程1.取决于系统 该ID可能会被主动保留。
运行命令
> ps -eaf | head -n 5
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:49 ? 00:00:02 /sbin/init splash
root 2 0 0 11:49 ? 00:00:00 [kthreadd]
root 3 2 0 11:49 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 11:49 ? 00:00:00 [kworker/0:0H]
和
> pidof init
1
将允许您独立验证。 1
在C中我们可以使用以下函数来获取进程ID 调用进程和调用进程的父进程ID
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
流程可以创建其他流程。调用创建的进程 &#34; 子流程&#34;我们将创建它们的过程称为 &#34; 父进程&#34;。
要创建子进程,我们使用系统调用
fork()
#include <unistd.h>
pid_t fork(void);
该函数由父进程调用一次,但它返回 两次。子进程中的返回值为0,并返回 父进程中的值是新子进程的进程ID。 1
进程可以有多个子进程,但没有系统 要求进程获取其所有子进程的进程ID,所以 父级观察子进程的返回值并可以使用 这些标识符用于管理它们。
一个进程只能有一个父进程,它始终是
可通过致电getppid
获取。
孩子是父母的副本,它获得父母的副本 数据空间,堆和堆栈。他们不共享这些部分 记忆! 2
我们将编译并执行以下代码片段以了解具体方法 这很有效,
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
int main(void) {
int var = 42; // This variable is created on the stack
pid_t pid;
// Two processes are created here
// v~~~~~~~~~~|
if ((pid = fork()) < 0) {
perror("Fork failed");
} else if (pid == 0) { // <- Both processes continue executing here
// This variable gets copied
var++;
printf("This is the child process:\n"
"\t my pid=%d\n"
"\t parent pid=%d\n"
"\t var=%d\n", getpid(), getppid(), var);
} else {
printf("This is the parent process:\n"
"\t my pid=%d\n"
"\t child pid=%d\n"
"\t var=%d\n", getpid(), pid, var);
}
return 0;
}
我们将在执行程序时看到没有任何保证 至于哪个进程首先执行。他们甚至可能会运作 同时,有效地交错输出。 3
$ # Standard compilation
$ gcc -std=c99 -Wall fork_example1.c -o fork_example1
$ # Sometimes the child executes in its entirety first
$ ./fork_example1
This is the child process:
my pid=26485
parent pid=26484
var=43
This is the parent process:
my pid=26484
child pid=26485
var=42
$ # and sometimes the parent executes in its entirety first
$ ./fork_example1
This is the parent process:
my pid=26461
child pid=26462
var=42
This is the child process:
my pid=26462
parent pid=26461
var=43
$ # At times the two might interleave
$ ./fork_example1
This is the parent process:
my pid=26455
This is the child process:
my pid=26456
parent pid=26455
var=43
child pid=26456
var=42
1 PID 代表进程ID , PPID 代表 父进程ID 。
2 进程ID 0保留供内核使用,所以 0不可能是孩子的进程ID。
3 许多系统都没有执行这些系统的完整副本 内存段,而只是在任一进程中创建一个副本 执行写。最初,共享区域由标记 内核为&#34;只读&#34;每当进程试图修改这些 区域内核授予每个进程自己的内存副本。
4 标准输出缓冲所以它不是一个完美的例子。
答案 1 :(得分:1)
使用getpid()和getppid()函数获取进程ID和父进程id。