<style>
H2{color:#BF0060 !important;}
H3{color:#009393 !important;}
p{color:Black !important;}
li strong {color:#4682b4 !important;}
</style>
# Process
## **TCP Echo Server & Client**
### **Socket**
* **listeing socket**
* `Requested by server program`
* `accept incoming connections`
* **connected socket**
* `created by kernal`
* `communicate with the connected socket`
* <img src="https://i.imgur.com/BE3CGHZ.png" width = "200"/></img>
### ***Echo Client***
* **問題**
* 無法同時 wait 兩個 blocking system call
* client 使用了 fgets(stdin) 和 readline(sockfd)
### ***Echo Client (Ver. 1)***
* **解法**
* Stop-and-Wait (Interactive) Mode
* Echo Client輪流處理stdin輸入與socket輸入
### ***Echo Client (Ver. 2)***
* **解法**
* call select
* <img src="https://i.imgur.com/BfDDwDc.png" width = "400"/></img>
### ***Echo Client (Ver. 3)***
* **解法**
* maintain data strutcture(2 queue)
* <img src="https://i.imgur.com/uthYIc5.png" width = "400"/></img>
## **IPC**
### **Intro**
* linux 五種常用的IPC (inter-processes communication)
* pipe
* shared memory
* ==signal==
* message queue
* domain socket
### **Signal**
* **software interrupt**
* `process to process 或 kernal to process (SIGCHILD)`
* **signal handler**
* `call sigaction`
* 向 kernel 註冊自己的 signal handler
* SIG_IGN: ignore it
* SIG_DFL: default: terminate or ignore
* **問題**
* `signalhandler 禁止重進入,其他 signal 來會被 block`
* `Mostly, signals are not queued,所以多個 same signal 只會觸發 handler 1 次`
* **解法:waitpid 取代 wait**
* `wait 會 block caller, whereas waitpid has an option (WNOHANG) that prevents it from blocking`
* `用 while loop 把多個 child 的 status 抓回來`
* while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
###### tags: `OS`
{"metaMigratedAt":"2023-06-16T13:32:03.263Z","metaMigratedFrom":"Content","title":"Process","breaks":true,"contributors":"[{\"id\":\"21d31f43-8679-45cd-b731-93b2f0b02abe\",\"add\":2281,\"del\":488}]","description":"listeing socket"}