操作系统练习:在Linux上创建进程,及查看进程状态

说明

进程在执行过程中可以创建多个新的进程。创建进程称为“父进程”,新的进程称为“子进程”。每个新的进程可以再创建其他进程,从而形成进程树。

每个进程都有一个唯一的进程标识符(process identifier,pid)。在Linux中,init进程是所有其他进程的根进程。

在Linux中,可以通过系统调用fork()创建新进程,新进程的地址空间复制了原来进程的地址空间。父进程和子进程都会继续执行fork()调用之后的指令。

注:本文是《操作系统概念(第九版)》第三章的练习。

创建进程

创建进程的C语言代码示例

#include 
#include 
#include 
#include 

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;
}

操作系统练习:在Linux上创建进程,及查看进程状态_第1张图片

编译和执行

  • 编译: 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:列出系统中所有当前活动进程的完整信息
    操作系统练习:在Linux上创建进程,及查看进程状态_第2张图片

  • ps -l: 可以查看进程状态,状态列位于列S;状态为Z的进程为僵尸进程
    file

  • pstree: 以树形结构展示进程
    操作系统练习:在Linux上创建进程,及查看进程状态_第3张图片

你可能感兴趣的:(linux,运维,服务器)