Linux进程的创建与销毁

活阎罗
• 阅读 433

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()系统调用来实现。

以上,如果觉得对你有帮助,点个赞再走吧,这样@知微之见也有更新下去的动力!

也欢迎私信我,一起交流!

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
think
Supervisor的安装与使用入门在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相
九路 九路
4年前
Android 内存管理机制
前言:Android系统是基于Linux内核开发的操作系统,而Linux系统有其独到的内存管理机制,会在进程活动停止后结束该进程。Android在此基础上优化了内存管理,会把进程都保存在内存中,直到系统需要更多内存为止,释放部分进程。这些被保存在内存中的进程,并不会影响系统的运行速度,相反,在重新打开这些进程时,会提升进程启动速度Android内存管
Bill78 Bill78
4年前
Python多进程 - 实现多进程的几种方式
方式一:os.fork()coding:utf8"""pidos.fork()1.只用在Unix系统中有效,Windows系统中无效2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0"""importospidos.fork()ifpid0:
Wesley13 Wesley13
3年前
Java并发基础
一、多线程基础知识1.进程和线程进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,
Stella981 Stella981
3年前
Linux fork() 系统调用
    在Linux中,当程序调用fork()函数时,系统会创建新的进程,为其分配资源(存储数据和代码的空间),然后把原来进程的所有值都复制到新进程中,只有少量数值与原来的进程值不同,相当于复制了本身。      fork()系统调用,被调用一次,却能返回两次:父进程和子进程各自返回一次。可以通过fork()的返回值的不同来区分父进程和子进程。
Wesley13 Wesley13
3年前
Java高级教程02
\TOC\1.Java线程1.1.多线程和多进程多进程:操作系统能够同时进行多个任务:每个app(word,播放器,浏览器)可以同时运行多线程:同一应用程序中哟多个顺序流同时执行线程是进程中的一部分1.2.线程的执行过程:!(
Stella981 Stella981
3年前
Linux 多线程编程
1.Linux“线程”进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux
Stella981 Stella981
3年前
Linux内核学习笔记(3)
一、进程创建:  Unix下的进程创建很特别,与许多其他操作系统不同,它分两步操作来创建和执行进程:fork()和exec()。首先,fork()通过拷贝当前进程创建一个子进程;然后,exec()函数负责读取可执行文件并将其载入地址空间开始运行。1、fork():kernel/fork.c  在Linux系统中,
Wesley13 Wesley13
3年前
Java多线程(一)、理解进程与多线程的概念及关系
一、什么是进程?简单理解,在多任务系统中,每个独立运行的程序就是一个进程,也可以理解为当前正在运行的每个程序都是一个进程。我们现在使用的操作系统大都是多任务系统的,如:Windows、Linux、MacOSX、Unix等。因为单个CPU在同一时刻只能执行一个程序,这是铁律。但在系统中单个CPU又怎么能同时执行多个程序呢?实际情况这是由操作系
Stella981 Stella981
3年前
Linux进程间的通信方式和原理
进程的概念进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。进程通信的概念进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其
深入浅出线程池 | 京东云技术团队
一、线程1、什么是线程线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。2、如何创建线程2.1、JAVA中
活阎罗
活阎罗
Lv1
独在异乡为异客,每逢佳节倍思亲。
文章
3
粉丝
0
获赞
0