进程复习(1)--特点与使用

2023/6/20 进程的用法和特点,通信方式分开篇章在写

特点

  1. 进程是一个独立的可调度的任务。进程是程序的一次执行过程
  2. 进程是动态的,包括创建、调度、执行、消亡
  3. 系统会为每个进程分配0-4g的虚拟空间,其中0-3g是用户空间,每个进程独有3g-4g是内核空间,所有进程共享。
  4. **轮转调度:时间片**,系统为每个进程分配时间片(几毫秒~几十毫秒),当一个进程的时间片用完时,CPU调度另外一个进程,从而实现进程调度的切换。
  5. Linux进程包含三个段:数据段``正文段``堆栈段数据段存放的是全局变量,常数以及动态数据分配的数据空间。正文段存放的是程序中的代码。堆栈段存放的是函数的返回地址、函数的参数以及程序中的局部变量
  6. 进程分类: 交互进程``批处理进程``守护进程 交互进程 是类进程是由shell控制和运行的。批处理处理不属于某个终端,它被提交到一个队列中以便顺序执行。守护进程后台运行。
  7. 子进程几乎拷贝了父进程的全部内容,包括代码,数据,系统数据段中pc值,栈中数据。
  8. 父子进程由独立的地址空间,互不影响,所以改变全局变量、静态变量,都互不影响。
  9. 父进程先结束,子进程成为孤儿进程。子进程先结束,父进程没有及时回收,子进程变成僵尸进程

函数接口

1、pid_t fork(void);//父进程,返回进程号>0,子进程中,返回值=0,失败返回值-1;
2、pid_t wait(int *status);//回收子进程资源,阻塞函数
//status为子进程退出状态,不接受子进程状态设为NULL,成功返回值为回收子进程的进程号。
3、pid_t waitpid(pid_t pid, int *status, int options);//options :0阻塞 WNOHANG非阻塞
4、void exit(int status);//结束进程,刷新缓存
5、void _exit(int status);//结束进程,不刷新缓存   通常0表示正常结束;
6、pid_t getpid(void);//获取当前进程的进程号
7、pid_t getppid(void);//获取当前进程的父进程号

功能代码

进程的创建与回收

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

int main()
{
    pid_t id=fork();
    if(id<0)
    {
        perror("fork err");
        return -1;
    }
    else if(id==0)//子进程
    {
        printf("child process\n");
    }
    else if(id>0)//父进程
    {
        wait(NULL);
        printf("father process\n");
        while(1);
    }
}

获取ID

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


int main(int argc, char const *argv[])
{
    pid_t id;
    if ((id = fork()) < 0)
    {
        perror("fork err");
        return -1;
    }
    else if (id == 0)
    {
        printf("in child, pid:%d ppid:%d\n", getpid(), getppid());
    }
    else
    {
        printf("in parent, pid:%d ppid:%d\n", id, getpid());
    }


    return 0;
}

守护进程

  1. 特点:
    守护进程是后台进程,不依赖于控制终端;
    生命周期比较长,从运行时开启,系统关闭时结束;
    它是脱离控制终端且周期执行的进程。
  2. 步骤:
    1) 创建子进程,父进程退出
    让子进程变成孤儿进程,成为后台进程;fork()
    2) 在子进程中创建新会话
    让子进程成为会话组组长,为了让子进程完全脱离终端;setsid()
    3) 改变进程运行路径为根目录
    原因进程运行的路径不能被卸载;chdir("/")
    4) 重设文件权限掩码
    目的:增大进程创建文件时权限,提高灵活性;umask(0)
    5) 关闭文件描述符
    将不需要的文件关闭;close()
  pid_t id = fork();
    if (id < 0)
    {
        perror("fork:");
    }
    else if (id == 0)
    {
        setsid();//在子进程创建新会话
        chdir("/");//修改路径为根目录
        umask(0);//修改文件权限掩码
        for (int i = 0; i < 3; i++)//关闭文件描述符
        {
            close(i);
        }
        while (1);
    }
    else
    {
        exit(0);
    }

posted @ 2023-06-20 20:45  moveddowm  阅读(10)  评论(0编辑  收藏  举报