守護進程即后臺運行的服務進程,它獨立于控制終端,原因是為了避免被任何終端產生的信息打斷,在執行過程中信息也不會在終端顯示,關于控制終端可以參考其他資料
### 查看守護進程
```bash
ps axj
```
### 實現過程
- fork創建子進程,父進程退出
- 子進程繼續調用setsid創建新會話,此時子進程會成為新會話的首進程,并脫離從父進程繼承過來的會話,控制終端
- 再次fork,退出父進程,目的是確保daemon進程不是會話首進程,因為當會話首進程open一個終端設備時會建立控制終端,守護進程不需要控制終端
- unmask(0),確保daemon有足夠創建文件和目錄的權限
- 修改當前工作目錄
- 關閉文件描述符
- 重定向標準輸出,標準輸入,錯誤輸出到/dev/null
### demo
```c
int daemon()
{
pid_t pid;
int fd, maxfd;
// fork
switch(fork())
{
case -1:
return -1
case 0:
break;
default:
_exit(0);
}
// setsid, create new session
if (setsid() == -1)
{
return -1;
}
// fork
switch(fork())
{
case -1:
return -1;
case 0:
break;
default:
_exit(0);
}
// umask
umask(0);
// chdir
chdir("/");
// close all file descriptor
maxfd = sysconf(_SC_OPEN_MAX);
if (maxfd)
{
for (int i = 0; i < maxfd; ++i)
{
close(i);
}
}
// dup to /dev/null
fd = open("/dev/null", O_RDWR);
if (fd < 0)
{
return -1;
}
if (dup2(fd, STDIN_FILENO) < 0 || dup2(fd, STDOUT_FILENO) < 0 || dup2(fd, STDERR_FILENO) < 0)
{
close(fd);
return -1;
}
close(fd);
return 0;
}
```
- php
- 編譯安裝
- 基本概念
- 垃圾回收機制
- 生命周期
- zval底層實現
- c擴展開發
- gdb調試工具
- 自定義擴展簡單demo
- 鉤子函數
- 讀取php.ini配置
- 數組
- 函數
- 類
- yaf擴展底層源碼
- swoole擴展底層源碼
- memoryGlobal內存池
- swoole協程使用記錄
- 單點登錄sso原理
- compser使用
- session實現機制
- c & linux
- gcc
- 指針
- 結構體,聯合和位字段
- 宏定義井號說明
- printf家族函數和可變參數
- 共享函數
- 靜態庫和動態庫
- makefile自動化構建
- 信號一
- 信號二
- inotify監控文件事件
- socket編程
- 簡介
- UNIX DOMAIN
- Internet DOMAIN
- TCP/IP
- 文件IO多路復用
- 內存管理
- 進程組,會話和控制終端
- daemon守護進程
- 多進程
- 多線程
- 常用進制轉換
- go
- 入門知識
- 字節和整數裝換
- python
- redis
- 應用場景
- 消息隊列
- 熱點數據
- 掃碼登錄
- 訂閱發布
- 次數限制
- 搶購超賣
- 持久化機制
- mysql
- 工作流程
- MyISAM和InnoDB區別
- 用戶和權限管理
- 執行計劃
- sql優化
- 事務和鎖
- 慢查詢日志
- case...when...then...end用法
- sql
- 參考
- linux
- 內核參數優化
- 防火墻設置
- docker
- docker入門知識
- 算法
- 多維數組合
- DFA算法
- 紅包金額分配