说明
进程在执行过程中可以创建多个新的进程。创建进程称为“父进程”,新的进程称为“子进程”。每个新的进程可以再创建其他进程,从而形成进程树。
每个进程都有一个唯一的进程标识符(process identifier,pid)。在Linux中,init进程是所有其他进程的根进程。
在Linux中,可以通过系统调用fork()创建新进程,新进程的地址空间复制了原来进程的地址空间。父进程和子进程都会继续执行fork()调用之后的指令。
注:本文是《操作系统概念(第九版)》第三章的练习。
创建进程
创建进程的C语言代码示例
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
pid_t pid;
pid = fork();
/* Both parent and child process will continue from here */
printf("current pid: %d \n", getpid());
if (pid < 0){
/* error occurred */
fprintf(stderr, "Fork Failed");
return 1;
} else if (pid == 0) {
/* child process */
printf("In Child, pid: %d, ppid: %d\n", getpid(), getppid());
execlp("/bin/ls", "ls", NULL);
} else {
/* parent process will wait for the child process to complete */
/* 如果子进程已经结束了,但是其父进程还没有调用wait(),这个进程就是僵尸进程 */
sleep(20);
wait(NULL);
printf("In parent, pid: %d, ppid: %d\n", getpid(), getppid());
}
return 0;
}
编译和执行
- 编译:
gcc -o process process.c
- 执行:
./process
- 执行结果的输出如下:
current pid: 198495 #父进程执行的,获取到的是父进程的pid
current pid: 198496 #子进程执行的,获取到的是子进程的pid
In Child, pid: 198496, ppid: 198495 #在子进程的判断语句中,pid为子进程pid,ppid为父进程的pid
process process.c #在子进程的判断语句中,执行execlp("/bin/ls", "ls", NULL);的输出。在此之后的20秒,子进程执行结束,短暂变为僵尸进程
In parent, pid: 198495, ppid: 197721 #在父进程的判断语句中,pid为父进程的pid,ppid为父进程的父进程pid
查看进程
-
ps -ef
:列出系统中所有当前活动进程的完整信息
-
ps -l
: 可以查看进程状态,状态列位于列S;状态为Z的进程为僵尸进程
-
pstree
: 以树形结构展示进程