写点什么

Linux 的信号

发布于: 2020 年 10 月 17 日
Linux的信号

SIGPIPE 管道终止 ,客户端向服务端发送数据,如果客户端突然终止,服务端并没有及时断开连接,仍向客户端 socket 发送数据,就成为写入无人读取的管道,产生 SIGPIPE 信号。如果不对该信号处理,引起 Crash,默认终止进程,将进程杀死。要对这信号接管。

SIGCHLD 子进程结束或者停止时发送;一般来说就是对进程接管或者用 wait 等待;如果不做处理会产生僵尸进程。一个早已死亡的进程,但在进程表中仍有位置。

SIGALRM 定时器信号,默认终止进程

SIGUSR1/SIGUSR2 自定义,默认终止进程


handler 是一个处理信号的函数


以 fork 的方式创建后台服务

  1. 用 fork 创建一个子进程,创建完,父进程退出,子进程变成一个孤儿进程被 init 进程进程接管

  2. 调用 setsid 建立新的进程会话

  3. 将当前工作目录切换到根目录中

  4. 将标准输入、输出,出错重定向到/dev/null

#include <iostream>#include <unistd.h>#include <stdlib.h>#include <fcntl.h>
using namespace std;
void daemonize(){ int fd; pid_t pid;// 进程创建失败// 如果=0就是创建成功子进程,如果小于0 就是创建失败;大于0就是 父进程 if (pid = fork()<0) { cout<<"can't create suprocess!"<<endl; } else{//父进程退出 exit(0); } //保证只有子进程 setid(); if(chdir("/")<0){ cout<<"cant change dir"<<endl; exit(-1); } //重定向 fd = open("/dev/null",O_RDWR); dup2(fd,STDIN_FILENO); dup2(fd,STDOUT_FILENO); dup2(fd,STDERR_FILENO);
}
int main(int arc,char* argv[]) { daemonize(); while (1){ sleep(1000); }}
复制代码

实现 daemon_app 编程

#include <iostream>#include <unistd.h>#include <stdlib.h>
using namespace std;
int main(int arc,char* argv[]) { if (daemon(0,0)==-1) { cout<<"error! \n" <<endl; exit(-1); } while (1) { sleep(1); } return 0;}
复制代码

daemon(int nochdir,int noclose)

nochdir 设置为 0 改变目录,设置非零就不改变目录

noclose 一样也是(关闭标准文件描述)


如果成功就返回 0,不成功就返回 1。

发布于: 2020 年 10 月 17 日阅读数: 52
用户头像

一个孤独的撰写者 2020.07.30 加入

主攻云计算、云安全,c++、python、java均有涉猎

评论

发布
暂无评论
Linux的信号