IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言-进程的API(2022详细带例子注释) -> 正文阅读

[C++知识库]C语言-进程的API(2022详细带例子注释)

目录

一、进程状态查询命令

二、什么是僵尸态

三、进程的接口函数

1、单进程和多进程的区别

2、进程的创建

?3、查询进程自己的PID号以及它父进程的PID号

四、僵尸进程和孤儿进程

1、僵尸进程

2、孤儿进程

五、解决僵尸进程

1、创建wait

2、没有使用wait的情况

?3、使用wait的情况

?六、进程的退出


?

一、进程状态查询命令

1.查看进程 ID 号:ps-ef(静态)

2.查看进程CPU占用率:top(动态)

二、什么是僵尸态

进程结束时,就从运行态变成僵尸态,所谓僵尸态,就是代表这个进程所占用的CPU资源和自身的任务结构体没有被释放,这个状态的进程就是僵尸态进程。

总结:

1)进程在暂停态时,收到继续的信号时,是切换到就绪态,而不是运行态。

2)程序的main函数执行return 0就会导致进程的退出,一定会变成僵尸态。

3)进程不可以没有父进程,也不能同时拥有两个父进程。

4)孤儿进程特征就是失去父进程时,会马上寻找继父,而不是等到孤儿进程变成僵尸态再找。

5)祖先进程一定要帮其他的进程回收资源。

三、进程的接口函数

1、单进程和多进程的区别

(1)单进程程序 -> 只能一行行代码去执行。

(2)多进程程序 -> 同时执行两行代码 -> 产生一个子进程,帮自己处理另外一件事情。

2、进程的创建

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

//创建进程
pid_t fork(void);

例子:

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

int main(void)
{
    //定义变量
    pid_t id;

    //产生一个子进程
    id = fork();
    while (1)
    {
        //这是一个父进程
        if(id > 0)
        {
            //延时 确保子进程先执行,让父进程睡眠3S 
            sleep(3);
            //父进程
            printf("父进程\n");
        }
        else if(id == 0)
        {
            sleep(1);
            //子进程执行
            printf("子进程\n");
        }
    }
    
    return 0;
}

结果:

?3、查询进程自己的PID号以及它父进程的PID号

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

//查询进程自己的PID号
pid_t getpid(void);

//查询父进程的PID号
pid_t getppid(void);

例子:

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

int main(void)
{
    //定义变量
    pid_t id;

    //产生一个子进程
    id = fork();

    //这是一个父进程,由于没有睡眠,所以这里是父进程先执行
    if(id > 0)
    {
        printf("父进程ID:%d, 父进程的父进程ID:%d\n", getpid(), getppid());
    }
    //这是一个子进程
    else if(id == 0)
    {
        printf("子进程ID:%d, 子进程的父进程ID:%d\n", getpid(), getppid());
    }

    return 0;
}

结果:

?

四、僵尸进程和孤儿进程

1、僵尸进程

僵尸进程:父进程还存在,但是去做的别的事情了(比如在一个死循环,没有退出),此时子进程退出之后,就变成了僵尸进程。(可以用ps -ef 查看,进程的状态栏为defunct,这就是所谓的“僵尸”进程)。

?测试僵尸进程:

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

int main(void)
{
    //定义一个变量
    pid_t id;

    //产生一个子进程
    id = fork();

    //父进程
    if(id > 0)
    {
        int cnt = 0;
        while(1)
        {
            sleep(1);
            printf("cnt:%d\n", cnt++);
        }
    }
    //子进程
    else if(id == 0)
    {
        printf("子进程\n");
    }

    return 0;
}

??注意:此时父进程一直在执行没有退出,导致子进程成了僵尸进程。

2、孤儿进程

孤儿进程:一般情况下,调用fork()函数创建的子进程,父进程如果比子进程先退出,那么这个子进程称之为 孤儿进程。那么,祖先进程systemd 就会成为该子进程的父进程,回收该子进程的资源。

测试孤儿进程

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

int main(void)
{
    //定义变量
    pid_t id;

    //产生一个子进程
    id = fork();

    if(id > 0)
    {
        sleep(8);
        printf("父进程\n");
    }

    else if(id == 0)
    {
        sleep(20);
        printf("子进程\n"); 
    }

    return 0;
}

? ?注意:父进程进程完退出,而子进程还没退出,此时就成为了孤儿进程。

五、解决僵尸进程

wait属于一个阻塞函数,如果子进程没有退出变成僵尸态,那么这个函数就会阻塞,直到子进程变成僵尸态之后,才会将子进程的资源回收。status还可以保存子进程的退出状态。

1、创建wait

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);

2、没有使用wait的情况

代码:

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

int main(void)
{
    //定义变量
    pid_t id,pi;
    //int status;

    //产生一个子进程
    id = fork();

    if(id > 0)
    {
        sleep(3);
        printf("父进程\n");
        //pi = wait(&status);
    }

    else if(id == 0)
    {
        sleep(6);
        printf("子进程\n"); 
    }

    return 0;
}

结果:

?3、使用wait的情况

代码:

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

int main(void)
{
    //定义变量
    pid_t id,pi;
    int status;

    //产生一个子进程
    id = fork();

    if(id > 0)
    {
        sleep(3);
        printf("父进程\n");
        pi = wait(&status);
    }

    else if(id == 0)
    {
        sleep(6);
        printf("子进程\n"); 
    }

    return 0;
}

结果:

?六、进程的退出

1)exit? (2)_Exit(3)_exit

代码:

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

int fun()
{
    exit(0);  // 整个进程马上结束
}

int main(void)
{
    //定义变量
    pid_t id;

    //产生一个子进程
    id = fork();

    if(id > 0)
    {
        sleep(3);
        printf("父进程\n");
        fun();
        printf("1111111\n");
    }

    else if(id == 0)
    {
        sleep(6);
        printf("子进程\n"); 
    }

    return 0;
}

结果:

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-25 23:05:06  更:2022-09-25 23:06:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:57:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码