任务管理与守护进程【Linux】

文章目录

进程组

组长是多个进程的第一个,组长进程的标识是,其进程组ID等于其进程ID

前台进程&后台进程

前台进程:能获取键盘输入,即拥有键盘文件

后台进程:不能获取键盘输入,即没有键盘文件

前台进程只能有一个,当一个进程变成前台进程后,bash会自动变为后台进程,此时bash就无法进行命令行解释了。

命令行中前台进程要一直存在 ,不能没有

ctrl + c,可以终止前台进程

./myprocess & ,加了& ,就变成后台进程了

powershell 复制代码
[cxq@iZwz9fjj2ssnshikw14avaZ lesson31]$ ll
total 36
-rw-rw-r-- 1 cxq cxq    90 Jul 15 22:41 Makefile
-rwxrwxr-x 1 cxq cxq 26440 Jul 15 15:31 myprocess
-rw-rw-r-- 1 cxq cxq   443 Jul 15 22:41 mysignal.cc
-rw-rw-r-- 1 cxq cxq     0 Jul 14 16:59 test.c
[cxq@iZwz9fjj2ssnshikw14avaZ lesson31]$ ./myprocess &

Linux中,一次登陆中,一个终端,一般会配上一个bash,每一个登陆,只允讲一个进程是前台进程,但是可以允许多个进程是后台进程

powershell 复制代码
[cxq@iZwz9fjj2ssnshikw14avaZ lesson43]$ ./process  >> log.txt & 
[1] 27184

1: 后台任务号

27184是进程pid

查看后台任务

powershell 复制代码
[cxq@iZwz9fjj2ssnshikw14avaZ lesson43]$ jobs
[1]+  Running                 ./process >> log.txt &

fg,将一个在后台运行的作业(job)调回到前台继续执行

powershell 复制代码
[cxq@iZwz9fjj2ssnshikw14avaZ lesson43]$ jobs
[1]+  Running                 ./process >> log.txt &
[cxq@iZwz9fjj2ssnshikw14avaZ lesson43]$ fg 1 

如果想要重新放回后台 ,ctrl + z

bg 命令用于将一个挂起(stopped)或暂停(suspended)的作业放入后台执行

powershell 复制代码
[cxq@iZwz9fjj2ssnshikw14avaZ lesson43]$ jobs
[1]   Running                 ./process >> log.txt &
[2]-  Running                 ./process >> log.txt &
[3]+  Running                 ./process >> log1.txt &
[cxq@iZwz9fjj2ssnshikw14avaZ lesson43]$ fg 3
./process >> log1.txt
^Z
[3]+  Stopped                 ./process >> log1.txt
[cxq@iZwz9fjj2ssnshikw14avaZ lesson43]$ jobs 
[1]   Running                 ./process >> log.txt &
[2]-  Running                 ./process >> log.txt &
[3]+  Stopped                 ./process >> log1.txt
[cxq@iZwz9fjj2ssnshikw14avaZ lesson43]$ bg 3 
[3]+ ./process >> log1.txt &

守护进程

关闭xshell后 ,这几个进程TTY就没了 ,与终端无关了 ,PPID全部变成1 ,会话还是保留了关闭xshell前的会话ID,关闭xshell后 ,这几个进程的PID变化了,也就是说这几个进程会受到用户的登陆和注册的影响

守护进程化:不想受到任何用户登陆和注销的影响

守护进程 :自成进程组、自成会话的进程

守护进程的本质,就是孤儿进程

调用setsid创建新会话的目的,是让当前进程自成会话,与当前bash脱离关系

cpp 复制代码
  pid_t setsid(void);

调用setsid创建新会话时,要求调用进程不能是进程组组长,但是当我们在命令行上启动多个进程协同完成某种任务时,其中第一个被创建出来的进程就是组长进程,因此我们需要fork创建子进程,让子进程调用setsid创建新会话并继续执行后续代码,而父进程我们直接让其退出即可

cpp 复制代码
    //父进程退出 ,子进程创建新会话 
   if (fork() > 0)
        exit(0);
    setsid();

功能:网络版少数单词的翻译,涉及到守护进程

Daemon.hpp

cpp 复制代码
#pragma once
#include <unistd.h>
#include <string>
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

const std::string nullfile = "/dev/null";
void Daemon(const std::string &cwd = "") // 设置空串为缺省值
{

    // 1. 忽略其他异常信号
    signal(SIGCLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGSTOP, SIG_IGN);

    // 父进程退出 ,子进程创建新会话
    if (fork() > 0)
        exit(0);
    setsid();

    // 3. 更改当前调用进程的工作目录
    if (!cwd.empty()) // 不为空
    {
        chdir(cwd.c_str());
    }
    // 4. 标准输入,标准输出,标准错误重定向至/dev/null
  int fd =  open(nullfile.c_str(),O_RDWR ); 
      if(fd > 0)
    {
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        close(fd);
    }
}

ls /proc/4686/fd -l, 系统会显示进程 ID 为 4686 的进程打开的所有文件描述符的详细信息

powershell 复制代码
[cxq@iZwz9fjj2ssnshikw14avaZ lesson42]$  ps ajx | head -1  && ps ajx | grep Tcpserver 
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1  4686  4686  4686 ?           -1 Ssl   1001   0:00 ./Tcpserver 8888
27777 11212 11211 27777 pts/1    11211 S+    1001   0:00 grep --color=auto Tcpserver
[cxq@iZwz9fjj2ssnshikw14avaZ lesson42]$ ls /proc/4686/fd -l
total 0
lrwx------ 1 cxq cxq 64 Sep 16 12:36 0 -> /dev/null
lrwx------ 1 cxq cxq 64 Sep 16 12:36 1 -> /dev/null
lrwx------ 1 cxq cxq 64 Sep 16 12:36 2 -> /dev/null
lrwx------ 1 cxq cxq 64 Sep 16 12:36 3 -> socket:[5908905]

daemon

daemon,创建守护进程

cpp 复制代码
int daemon(int nochdir, int noclose);
  • 如果参数nochdir为0,则将守护进程的工作目录该为根目录,否则不做处理。
  • 如果参数noclose为0,则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null,否则不做处理。
相关推荐
峥嵘life几秒前
Android16 EDLA【GTS】GtsUnofficialApisUsageTestCases存在fail项
android·linux·运维·学习
德育处主任Pro2 分钟前
『NAS』推荐几个绿联 NAS Docker 能用的镜像加速器
运维·docker·容器
漏刻有时3 分钟前
宝塔服务器被篡改 Nginx Location 配置的安全风险剖析与修复指南(流量劫持、服务器资源消耗、站点功能异常、溯源困难)
服务器·nginx·安全
海天鹰3 分钟前
fcitx5皮肤
linux
晚风吹长发8 分钟前
初步了解Linux中的信号保存和简单使用
linux·运维·服务器·数据结构·后端·算法
林深现海9 分钟前
基于宇树 Go2 与 NaVILA 的全栈视觉导航系统深度解析
linux·vscode·yolo·ubuntu·机器人
阿豪学编程11 分钟前
【Linux】Socket网络编程
linux·服务器·网络
va学弟18 分钟前
Java 网络通信编程(1):服务器多任务连接+广播消息实现
java·运维·服务器
wasp52019 分钟前
Hudi Flink 集成分析
大数据·服务器·flink
小张成长计划..19 分钟前
【linux】4:编辑器vim的使用
linux·编辑器·vim