Linux网络编程套接字(五)之简单的TCP网络程序3【TCP守护进程化】
文章目录
- 简单的TCP网络程序
- Tcp守护进程化
- 控制前台后台进程的命令
- Linux进程间的关系
- 实现守护进程
简单的TCP网络程序
Tcp守护进程化
process.cc
#include<iostream>
#include<string>
#include<unistd.h>using namespace std;int main()
{while(1){cout<<"hello world"<<endl;sleep(1);}return 0;
}
这个进程默认在前台运行。所以可以用ctrl+c
终止进程。
加个&
,该进程就变后台进程了,也可以执行输入的命令了,但是不可以用CTRL+C
终止进程。
控制前台后台进程的命令
./process
前台进程
./process &
后台进程
fg 任务号
把后台进程放到前台
jobs
查看后台任务
把前台进程变成后台
先 CTRL+Z
暂停进程
这时候暂停的进程就变成后台进程了(bash自动变成前台进程)
bg 任务号
启动后台任务
Linux进程间的关系
bash退出,云服务器的Linux后台进程不会退出,
但是PPID
将会变成1,也就是被操作系统领养了,PID\PGID\SID不变
TTY变成 ?
,也就是与终端无关。TPGID也变成了-1.
父进程变成操作系统说明:后台进程是会受到用户登陆注册的影响的。
如果不想受到任何用户登陆和注销的影响 – 守护进程化
注销:把会话删掉!把所有新起的任务删除!
实现守护进程
setsid
创建一个会话,将组ID设置为会话ID,创建会话的进程不可以是进程组的组长!
//关键代码
if(fork()>0)exit(0);
setsid();
所以守护进程的本质也是孤儿进程!
写入 /dev/null
的数据会被丢弃
Daemon.hpp
#pragma once#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <cstdlib>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>using namespace std;
const string nullfile = "/dev/null";void Daemon(const string &s = "")
{// 1.忽略其他异常信号signal(SIGPIPE, SIG_IGN);signal(SIGSTOP, SIG_IGN);signal(SIGCHLD, SIG_IGN);// 2.将自己变成独立的会话if (fork() > 0)exit(0);setsid();// 3.更改当前的调用进程的工作目录if (!s.empty())chdir(s.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);}
}
关闭守护进程
daemon