进程

作者: StevenHD | 来源:发表于2020-11-30 00:15 被阅读0次
内存空间
  • 注意cmd命令行environ环境变量

  • 常量保存在代码段Text

    完整的内存空间与进程

text段——可执行的,只读的,不能写
data段——已初始化的数据,可读可写,但是不能执行
bss段——未初始化的数据,可读可写,但是不能执行
Heap, Stack, cmd——均是可读可写

  • 动态库在执行的时候会加载到Stack中,Stack就是可读可执行的
  • 静态库在编译的时候,就会跟我们自己写的代码一起放在Text段中

extern可以用来声明这个变量是一个外部变量

  • extern char** environ;
    

在Linux中,所有的进程都是复制出来的,从init进程复制出来的,init进程的PID是1号


  • 父进程和子进程,如果【父进程先退出了】,是不会杀死子进程的,但是子进程会变成 孤儿进程 ,托管给其他进程。不像多线程,主线程如果贸然退出,子线程也会被杀死。

孤儿进程会托管给init进程(1号进程)

0号进程是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。完成加载系统后,演变为进程调度、交换

  • 父进程和子进程,如果【子进程先退出了】,那么父进程这时候还在运行,是不会管子进程的,所以子进程就会变成僵尸进程,等到父进程也退出的时候,子进程会被重新托管给init进程,init进程会来回收子进程。

回收子进程,可以用wait()waitpid(),第一个wait()是阻塞的回收,第二个waitpid()是非阻塞轮询回收。

通过kill杀死进程是通过信号来杀死的,也可以等待进程执行结束退出。这是2种,也是运行态和僵尸态的转换。


挂起一个命令可以使用SIGSTOP,也就是kill 19来完成。

父进程产生子进程后,可以通过kill 19让子进程挂起,然后可以再用kill 18让子进程继续运行,然后子进程会正常退出,父进程也会回收子进程。


//
// Created by hlhd on 2020/11/30.
//

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

using namespace std;

int main1(int argc, char** argv)
{
    int i = 0;
    printf("Current process [%d]\n", getpid());

    pid_t pid = fork();
    if (pid > 0)
    {
        for (i = 0; i < 10; i ++ )
        {
            printf("parent process [%d]\n", getpid());
            sleep(1);
        }
        exit(0);
    }
    else if (pid == 0)
    {
        for (i = 0; i < 5; i ++ )
        {
            printf("child process [%d]\n", getpid());
            sleep(1);
        }
        exit(0);
    }

    return 0;
}

int main2(int argc, char** argv)
{
    printf("Current process's PID = [%d]\n", getpid());
    printf("Current process's PPID = [%d]\n", getppid());

    printf("Current process's UID = [%d]\n", getuid());
    printf("Current process's EUID = [%d]\n", geteuid());

    printf("Current process's GID = [%d]\n", getgid());
    printf("Current process's EGID = [%d]\n", getegid());

    return 0;
}

int main3(int argc, char** argv)
{
    int i = 0;
    pid_t pid = fork();

    if (pid > 0)
    {
        pid_t cpid = wait(nullptr);
        printf("wait child process [%d]\n", cpid);
        exit(0);
    }
    else if (pid == 0)
    {
        for (i = 0; i < 5; i ++ )
        {
            printf("child process [%d]\n", getpid());
            sleep(1);
        }
        exit(0);
    }
    else perror("fork error");

    return 0;
}

int main(int argc, char** argv)
{
    int i = 0;
    pid_t pid = fork();

    if (pid > 0)
    {
        int status;
        pid_t cpid = wait(&status);
        printf("wait child process [%d]\n", cpid);

        if (WIFEXITED(status))
            printf("process [%d] exit %d\n", cpid, WEXITSTATUS(status));
        else if (WIFSIGNALED(status))
            printf("process [%d] signal %d killed\n", cpid, WTERMSIG(status));

        exit(0);
    }
    else if (pid == 0)
    {
        for (i = 0; i < 5; i ++ )
        {
            printf("child process [%d]\n", getpid());
            sleep(1);
        }
        exit(1);
    }
    else perror("fork error");

    return 0;
}

相关文章

  • 进程,进程,进程

    1. 进程是具有独立功能的程序关于某个数据集合的一次运行过程。(1)程序本身是静态的,是没有生命周期的,只有运行起...

  • Linux回收子进程

    孤儿进程 孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程...

  • Android 五种进程的管理

    安卓有几种进程? 前台进程 可见进程 服务进程 后台进程 空进程 前台进程 用户当前操作所必需的进程。如果一个进程...

  • 孤儿进程、僵尸进程与进程回收

    孤儿进程与僵尸进程 孤儿进程:父亲死了,子进程被init进程领养僵尸进程:子进程死了,父进程没有回收子进程的资源(...

  • 第三章 进程管理

    进程基础 进程基本概念 进程组:只包括祖先进程,子孙进程,兄弟进程进程树:所有进程僵尸进程:在父进程中经常会调用w...

  • Chaprter-1 [进程]

    进程模型 进程定义 进程的创建 进程的终止 进程的层次结构 进程的状态 进程的状态图 进程的实现

  • 进程操作

    一、进程创建 进程树 父进程创建若干子进程,子进程再创建其子进程,依次类推,构成进程树。进程的调度,其实就是在进程...

  • 进程管理(一)进程操作

    进程创建 、进程执行映像和加载、进程运行(进程调度)、进程间的互斥与同步、进程间通信、进程终止 1、进程创建 PC...

  • python中的僵尸进程和孤儿进程

    孤儿进程:父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被 init 进程(进程号为 1)所收养,...

  • 容器中的孤儿进程&僵尸进程简介

    背景简介 孤儿进程 父进程先于子进程退出,那么子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)接管,并...

网友评论

      本文标题:进程

      本文链接:https://www.haomeiwen.com/subject/jtmlwktx.html