首页 > 系统相关 >Linux进程的创建与销毁

Linux进程的创建与销毁

时间:2023-03-14 12:31:24浏览次数:50  
标签:fork 销毁 创建 printf pid exit Linux 进程 PID

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

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

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

标签:fork,销毁,创建,printf,pid,exit,Linux,进程,PID
From: https://blog.51cto.com/u_15986859/6120343

相关文章

  • Linux60个小时速成
    Linux60个小时速成[toc]1前言1.1课程介绍1.2学习方向1.3应用领域个人桌面领域 此领域是传统linux应用最薄弱的环节,传统linux由于界面简单、操作复杂、应用软件少的......
  • Linux 工具命令(03): 使用 envsubst 渲染配置文件
    Linux工具命令(03):使用envsubst渲染配置文件如果在公众号文章发现状态为已更新,建议点击查看原文查看最新内容。状态:未更新原文链接:https://typonotes.co......
  • Linux环境编程必须懂的几个概念
    Linux系统对于初学编程的程序员来说是必须要要重点掌握好的,这样才能更好的编写出代码,那么在平常使用中我们需要注意那些知识点,懂得这几个方面让你Linux爬虫让你得心应手。系......
  • linux系统 u盘无法复制粘贴显示Read-only file system
    参考https://support.huaweicloud.com/trouble-ecs/ecs_trouble_0330.html如果是u盘内文件损坏导致的,umount重新卸载挂载方式无法解决,则可以如下解决termial中输入sudof......
  • CentOS -Linux 等保-安全加固相关配置
     1、口令锁定策略规则描述:设置口令认证失败后的锁定策略为了保障用户系统的安全,建议用户设置口令出错次数的阈值,以及由于口令尝试被锁定用户的自动解锁时间。用户锁定......
  • 【Linux】服务器免密登录
    ssh-copy-id-i~/.ssh/id_rsa.pub<user>@<server>  免密登录,需要先在本机生成公钥,然后将公钥拷贝到远程主机,拷贝的过程,既可以手动(在远程主机根目录下创建.ssh目录,然......
  • Linux的文件权限管理
    Linux文件权限管理介绍一:Ubuntu简介1、什么是UbuntuUbuntu是基于Debian开发的一个开源的Linux操作系统,Ubuntu这个名字名称来⾃⾮洲南部某种语言的一个词语,Ubuntu每6个......
  • Linux编辑技巧
    https://blog.csdn.net/tujidi1csd/article/details/124171196全文替换:%s/源字符串/目的字符串/g一个一个选择替换:%s/源字符串/目的字符串/gc......
  • LINUX设置ssh免密登录
    1.打开ssh服务,关闭防火墙 systemctl stopfirewalld2.保证同网段,登录控制机执行:ssh-keygen 一路回车(生成公钥、私钥)3.ssh-copy-id -i 要访问的主机地址即可......
  • Linux Mint 18.1″Serena”首个Beta版本发布
    ​​Linux​​ Mint18.1Serena的首个beta版本已经于今天正式开放下载。LinuxMint基于LTS版本的Ubuntu系统,这意味着系统能够获得长期支持。创始人ClementLefebvre表示......