ps: 参考资料:linux C++通信架构实战 卷1nginx
查看进程bash
ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E 'bash|PID|nginx'
定义:一种长期在后台运行的进程,不与任何终端关联架构
ps -efj
。
编写规则函数
在编写前还须要知道一些相关概念操作系统
//文件描述符虽然是数字,可是,若是咱们把文件描述符直接理解成指针(指针里边保存的是 //地址——地址说白了也是个数字); write(STDOUT_FILENO,"aaaabbb",6);
案例代码命令行
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/stat.h> #include <fcntl.h> //建立守护进程 //建立成功则返回1,不然返回-1 int ngx_daemon() { int fd; switch (fork()) //fork()子进程 { case -1: //建立子进程失败,这里能够写日志...... return -1; case 0: //子进程,走到这里,直接break; break; default: //父进程,直接退出 exit(0); } //只有子进程流程才能走到这里 if (setsid() == -1) //脱离终端,终端关闭,将跟此子进程无关 { //记录错误日志...... return -1; } umask(0); //设置为0,不要让它来限制文件权限,以避免引发混乱 fd = open("/dev/null", O_RDWR); //打开黑洞设备,以读写方式打开 if (fd == -1) { //记录错误日志...... return -1; } if (dup2(fd, STDIN_FILENO) == -1) //先关闭STDIN_FILENO[这是规矩,已经打开的描述符,动他以前,先close],相似于指针指向null,让/dev/null成为标准输入; { //记录错误日志...... return -1; } if (dup2(fd, STDOUT_FILENO) == -1) //先关闭STDIN_FILENO,相似于指针指向null,让/dev/null成为标准输出; { //记录错误日志...... return -1; } if (fd > STDERR_FILENO) //fd应该是3,这个应该成立 { if (close(fd) == -1) //释放资源这样这个文件描述符就能够被复用;否则这个数字【文件描述符】会被一直占着; { //记录错误日志...... return -1; } } return 1; } int main(int argc, char *const *argv) { if(ngx_daemon() != 1) { //建立守护进程失败,能够作失败后的处理好比写日志等等 return 1; } else { //建立守护进程成功,执行守护进程中要干的活 for(;;) { sleep(1); //休息1秒 printf("休息1秒,进程id=%d!\n",getpid()); //你就算打印也没用,如今标准输出指向黑洞(/dev/null),打印不出任何结果【不显示任何结果】 } } return 0; }