进程组
概念
进程组代表
一个
或多个
进程的集合
,每一个进程都属于一个进程组,简化对多个进程的管理;
- 当父进程创建子进程时,默认
子进程
与父进程
属于同一进程组
;进程组
的ID等于组长
进程的ID;- 可通过
kill signal -进程组号
将整个进程组杀死;- 进程组的存亡与进程组长无关,只要有任何
一个在
,则就不会终止
;
进程组常用操作
/**
* getpgrp
* -------
* param pid:传入子进程,则返回该子进程组的ID
* 若不传入参数,则返回调用者的进程组ID
* return:返回调用者的进程组ID
* */
/**
* getpgid
* -------
* func:获得指定进程组的ID
* param:当传入0时,用法和getpgrp一样
* return:成功返回0,失败返回-1
* */
/**
* setpgid
* -------
* func:改变进程默认所属的进程组
* param one:传入进程id
* param two:传入进程组ID
* return:成功返回0,失败返回-1
* */
会话
概念
使用子进程创建会话,可将程序设置称为一个守护进程;
注意事项:
- 调用进程不能是进程组组长,该进程变成
新会话首进程
;- 该进程成为一个新进程组的组长进程;
- 需要
root
权限;- 新会话丢弃原有的控制终端,该会话
没有控制终端
;- 若调用进程是组长进程,则会出错返回;
- 建立新会话时,
先调用fork
,父进程终止
,子进程调用setsid
;
setsid
/**
* pid_t setsid(pid_t pid)
* ----------------------------
* func:创建会话;
* param pid:传入子进程;
* retuen:返回会话ID;
*/
守护进程
基本概念
Deamon进程,是Linux后台服务进程,通常独立于控制终端且周期性地执行某种任务或等待处理某些发生的事件,一般采用d结尾的名字;
创建步骤
- 创建子进程【父进程退出,让子进程运行脱离控制终端】
- 子进程创建新会话【setsid】
- 改变进程的工作目录【chdir,防止占用可卸载的文件系统,也可以换成其他路径】
- 指定文件掩码【防止继承的文件创建屏蔽字拒绝某些权限、增加守护进程灵活性】
- 将文件描述符重定向【防止浪费资源】
- 守护进程主逻辑
/*----------------------------------------------------------------------
> File Name: deamomd.cpp
> Author: Jxiepc
> Mail: Jxiepc
> Created Time: Tue 28 Dec 2021 04:42:57 PM CST
----------------------------------------------------------------------*/
/* 指定每隔2秒往文件内写入 */
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
/**
* 创建守护进程:
* 创建子进程
* 子进程创建新会话
* 改变进程的工作目录
* 指定文件掩码
* 将文件描述符重定向
* 守护进程主逻辑
* */
void test(){
pid_t pid;
if((pid = fork()) < 0){
cout << "fork error" << endl;
exit(1);
}else if(pid > 0){
exit(1);
}
pid = setsid();
int ret = chdir("/");
if(ret < 0){
cout << "fork error" << endl;
exit(1);
}
umask(0);
close(STDIN_FILENO);
open("/dev/null", O_RDWR);
dup2(0, STDOUT_FILENO);
dup2(0, STDERR_FILENO);
}
int main(int argc, char* argv[])
{
test();
int fd = open("/root/code/linux-sys-code/log.txt", O_WRONLY, 0644);
if(fd < 0)
{
cout << "error" << endl;
exit(1);
}
while(1){
write(fd, "20200202\n", 9);
sleep(2);
}
close(fd);
return 0;
}