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; }