进程是有进程组和会话组的:
我们写的网络服务器进程,就是这个会话中的一个进程组(自成进程组)
但是,这样的服务器在我们关闭bash窗口的时候他就会自动退出,且在我们用命令运行后,这个窗口就一直在前台运行干不了其他的了(前台进程)
所以我们的服务器进程应该把他设置为守护进程(精灵进程):
让其独属于一个会话,
具体实现代码:
#pragma once
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
const char *root = "/";
const char *dev_null = "/dev/null";
void Daemon(bool ischdir, bool isclose)
{
// 1. 忽略可能引起程序异常退出的信号
signal(SIGCHLD, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
// 2. 让自己不要成为组长
if (fork() > 0)
exit(0);
// 3. 设置让自己成为一个新的会话, 后面的代码其实是子进程在走
setsid();
// 4. 每一个进程都有自己的CWD,是否将当前进程的CWD更改成为 / 根目录
if (ischdir)
chdir(root);
// 5. 已经变成守护进程啦,不需要和用户的输入输出,错误进行关联了
if (isclose)
{
close(0);
close(1);
close(2);
}
else
{
// 这里一般建议就用这种
int fd = open(dev_null, O_RDWR);
if (fd > 0)
{
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
close(fd);
}
}
}
有了这个函数,之服务器运行起来之前就先调用这个函数把他设置为守护进程就行了: