C++学习笔记42:进程管理

子进程异步清除

  SIGCHLD信号:子进程终止时,向父进程自动发送,编写此信号处理例程,异步清除子进程

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

sig_atomic_t child_exit_status;
extern "C"
{
    void CleanUp(int sig_num)
    {
        int status;
        wait(&status);                //清除子进程
        child_exit_status = status; //存储子进程的状态
    }
}

int main()
{
    //处理SIGCHLD信号
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = &CleanUp;
    sigaction(SIGCHLD,&sa, NULL);
    //正常处理代码在此,例如调用fork()创建子进程
    return 0;
}

创建守护进程的步骤

  • 创建新进程:新进程将成为未来的守护进程
  • 守护进程的父进程退出:保证祖父进程确认父进程已结束,且守护进程不是组长进程
  • 守护进程创建新进程组和新会话:并成为两者的首进程,此时刚创建的新会话还没有关联控制终端
  • 改变工作目录:守护进程一般随系统启动,工作目录不应该继续使用继承的工作目录
  • 重设文件权限掩码:不需要继承文件权限掩码
  • 关闭所有文件描述符:不需要继承任何打开的文件描述符
  • 标注流重定向到/dev/null
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>

int main()
{
    pid_t pid = fork();
    if (pid == -1)
    {
        return -1;
    }
    else if (pid != 0)
        exit(EXIT_SUCCESS);
    //子进程
    if (setsid() == -1)
        return -2;
    //设置工作目录
    if (chdir("/") == -1)
        return -3;
    //重设文件权限掩码
    umask(0);
    //关闭文件描述符
    for (int i = 0; i < 3; i++)
        close(i);
    //重定向标准流
    open("/dev/null", O_RDWR);
    dup(0);
    dup(0);
    //守护进程的实际工作代码在此
    return 0;
}

守护进程创建函数daemon()

  实现上述功能,减轻编写守护进程的负担

时间: 2024-10-14 02:13:54

C++学习笔记42:进程管理的相关文章

Linux System Programming 学习笔记(五) 进程管理

1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity inside of a process the virtualization of memory is associated with the process, the threads all share the same memory address space 2. pid The idle pro

计算机操作系统学习笔记_2_进程管理 --进程与线程(上)

h3.western { font-family: "Liberation Sans",sans-serif; }h3.cjk { font-family: "微软雅黑"; }h3.ctl { font-family: "AR PL UMing CN"; }h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { fon

计算机操作系统学习笔记_4_进程管理 --处理机调度

h3.western { font-family: "Liberation Sans",sans-serif; }h3.cjk { font-family: "微软雅黑"; }h3.ctl { font-family: "AR PL UMing CN"; }h1 { margin-bottom: 0.21cm; }h1.western { font-family: "Liberation Sans",sans-serif; f

学习笔记之进程管理的相关重要命令

进程管理命令之ps,top,htop,dstat ps:report a snapshot of the current processes.           显示当前进程的状态        语法:ps [options] 选项有三种风格: 1.UNIX options, which may be grouped and must be preceded by a dash. 2.BSD options, which may be grouped and must not be used

计算机操作系统学习笔记_5_进程管理 -- 同步与互斥

h3.western { font-family: "Liberation Sans",sans-serif; }h3.cjk { font-family: "微软雅黑"; }h3.ctl { font-family: "AR PL UMing CN"; }h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { fon

linux内核学习笔记-2.进程管理

部分内容来自:Linux Kernel Development(Third Edition),Robert Love,陈莉君等译. 1.进程 进程是正在执行的程序代码的实时结果,包含打开的文件.挂起的信号等.线程是进程中的活动的对象,内核调度的对象是线程.在Linux内核对线程与进程并不加以区分,线程只不过是一种特殊的进程. 2.进程描述符 内核把进程的信息存放在task list的双向循环链表中,链表中的每一项都是类型为task_struct.成为进程描述符的的结构,包含一个具体进程的所有信息

Linux学习笔记:进程管理

显示系统所有进程:ps aux: 重置某个进程:kill -HUP /var/run/crond.pid: 六亲不认杀死进程:cat /var/run/crond.pid | xargs kill -9: ps aux|grep -v grep |grep ssh|awk '{print $2}'1870 ps aux|grep -v grep |grep ssh|awk '{print $2}' |xargs -L 1 sudo kill -HUP #sudo 提升权限# ps -aux 提示

linux学习笔记之进程管理

ps    process state unix    system V BSD ps -e    显示所有进程(tty相关的是前台进程 ?tty无关) -u    用户相关 -f    full    format    listing -F    print extra    information -o command  选择显示字段 ps aux ps -ef ps -eF bsd风格 a x state: S    sleep s    session loader <    high

计算机操作系统学习笔记_6_进程管理 --死锁

一.死锁的概念 1.死锁的概念 系统中两个或两个以上的进程无限期地相互等待永远不会发生的条件,系统处于一种停滞状态,这种情况称为死锁. 2.死锁产生的原因 (1)进程推进顺序不当 (2)对互斥资源的分配不当[并不是资源不足,但是剩余资源不足是有可能产生死锁的]. 必须要指出的是,系统资源不足并不是产生死锁的原因,进程资源如果不足则进程就不会被创建,只有在资源部分分配以后,剩余的资源不能满足某些个进程的请求,造成进程集无法推进的现象才是死锁. 3.产生死锁的四个必要条件[必须满足四个条件,才有可能

node.js在windows下的学习笔记(8)---进程管理Process

process是一个全局内置对象,可以在代码中的任何位置访问此对象,这个对象代表我们的node.js代码宿主的操作系统进程对象. 使用process对象可以截获进程的异常.退出等事件,也可以获取进程的当前目录.环境变量.内存占用等信息,还可以执行进程退出.工作目录切换等操作 1.当我们想要查看应用程序当前目录时,可以使用cwd函数 : process.cwd(); 2.如果需要改变应用程序目录,就要使用chdir函数了: process.chdir('目录名'); 3.stdout是标准输出流,