進程組,會話和控制終端之間的關系如下

一個控制終端對應一個會話,會話包括多個進程組,進程組包括前端進程組和后端進程組
### 進程組
- 由上圖可知,在同個進程組中的各個進程PGID一樣,每個進程組首個進程稱為進程組首進程,首進程的PID(進程ID)會成為PGID(進程組ID);
- 前臺進程組才可以從控制終端讀取輸入;
- 子進程會繼承父進程的PGID(進程組ID)
#### getpgrp獲取進程組ID
```c
#include <unistd.h>
pid_t getpgrp(void);
```
#### setpgid修改進程組ID
```c
// returns 0 on success, or -1 on error
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid)
```
### 會話
- 由上圖可知,同個會話的所有進程的SID(會話ID)一樣;首個創建該會話的進程成為會話首進程,會話首進程的PID會成為SID,如圖bash為會話的首進程
- 子進程會繼承父進程的SID(會話ID)
#### getsid獲取會話ID
```c
// returns sid on success, or -1 on error
#include <unsitd.h>
pid_t getsid(pid_t pid)
```
當pid為0時,獲取的是當前調用進程的會話ID
#### setsid設置會話ID
```c
// returns sid on success, or -1 on error
pid_t setsid(void)
```
- 如果調用進程不是會話首進程,那么會新建一個會話,否則調用會報出EPERM錯誤
- 會話被創建出來是沒有控制終端(需要會話首進程打開一個終端才會建立控制終端),所有之前到控制終端的連接都會被斷開
### 控制終端
- 會話首進程首次打開一個終端設備時會建立控制終端,當控制終端建立后,會話首進程會成為該終端的控制進程
- 子進程會繼承父進程的控制終端
- 當斷開和終端連接時,內核會向控制進程發送一個SIGHUP信號,這也是判斷一個進程是否為控制進程的方法
### 參考
- Linux系統編程手冊(下冊)
- 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算法
- 紅包金額分配