乐趣区

关于人工智能:Linux进程的创建与销毁

Linux 操作系统是一种多任务、多用户的操作系统,这意味着它能够同时运行多个过程,每个过程都能够执行不同的工作。

在本文中,咱们将介绍如何在 Linux 零碎中创立和销毁过程。

过程的创立

在 Linux 零碎中,过程的创立能够通过 fork() 零碎调用来实现。

fork() 函数将以后过程复制一份,创立一个新的过程。

新过程的代码、数据和堆栈等信息都是从原过程复制而来的。fork() 函数返回两个值,对于父过程,它返回子过程的过程 ID(PID),对于子过程,它返回 0。

上面是一个应用 fork() 函数创立子过程的 C 语言程序:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    pid_t pid;

    pid = fork();

    if (pid == -1) {printf("Failed to fork.\n");
        return 1;
    }

    if (pid == 0) {printf("I am the child process %d. parent PID is %d.\n", getpid(),getppid());
        // 这里是子过程的代码
    } else {printf("I am the parent process %d, child PID is %d.\n",getpid(),pid);
        // 这里是父过程的代码
    }

    return 0;
}

运行编译好的程序,打印信息如下

I am the parent process 3891, child PID is 3892.
I am the child process 3892. parent PID is 3891.

在这个程序中,咱们首先申明了一个 pid_t 类型的变量 pid,它用于存储 fork() 函数的返回值。接着,咱们调用 fork() 函数,并依据返回值判断以后是父过程还是子过程。如果返回值为 -1,阐明 fork() 函数调用失败,程序将间接退出。如果返回值为 0,阐明以后是子过程,程序将执行子过程的代码。否则,阐明以后是父过程,程序将执行父过程的代码。

过程的销毁

在 Linux 零碎中,过程的销毁能够通过 exit() 零碎调用来实现。exit() 函数将以后过程终止,并返回一个退出状态。如果过程没有调用 exit() 函数而间接退出,零碎会主动调用 exit() 函数。

上面是一个应用 exit() 函数终止过程的 C 语言程序:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() 
{
    pid_t pid;

    // 创立子过程
    pid = fork();

    if (pid < 0) {fprintf(stderr, "创立子过程失败 \n");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子过程代码
        printf("子过程开始执行,PID is %d.\n",getpid());
        sleep(10);
        printf("子过程执行结束 \n");
        exit(EXIT_SUCCESS);
    } else {
        // 父过程代码
        printf("父过程开始执行 \n");
        sleep(5);
        printf("父过程执行结束 \n");

        // 期待子过程完结
        int status;
        waitpid(pid, &status, 0);

        if (WIFEXITED(status)) {printf("子过程失常完结,退出状态为 %d\n", WEXITSTATUS(status));
        } else if (WIFSIGNALED(status)) {printf("子过程被信号中断,信号编号为 %d\n", WTERMSIG(status));
        } else {printf("子过程其余未知状态 \n");
        }
    }

    return 0;
}

该程序首先应用 fork() 函数创立一个子过程,并在子过程中执行一些操作,而后父过程期待一段时间后完结,并应用 waitpid() 函数期待子过程完结。子过程在执行结束后调用 exit() 函数退出。在父过程中,能够通过 waitpid() 函数获取子过程的退出状态。最初,程序完结并返回 0。

  • 编译后运行程序,失常运行打印信息如下
 父过程开始执行
子过程开始执行,PID is 4013.
父过程执行结束
子过程执行结束
子过程失常完结,退出状态为 0 
  • 运行后,终端输出 kill – 9 4015 强制完结子过程,打印如下
 父过程开始执行
子过程开始执行,PID is 4015.
父过程执行结束
子过程被信号中断,信号编号为 9 

小结

在 Linux 零碎中,过程的创立能够通过 fork() 零碎调用来实现,过程的销毁能够通过 exit() 零碎调用来实现。

以上,如果感觉对你有帮忙,点个赞再走吧,这样 @知微之见也有更新上来的能源!

也欢送私信我,一起交换!

退出移动版