Code makes the world a better place

Example of Signals by `sigaction` in Unix

Unix 中 processes 之間溝通有很多種,本篇介紹 signal 的簡易使用。可以先閱讀 Beej 的介紹。顧名思義,signal 就是程序發送和接受訊號,例如我們在使用 Shell 的時候,之所以 Ctrl-C 可以中斷程式執行,就是因為 Shell 捕捉到 Ctrl-C 發送的 SIGINT 訊號,知道有一個 interrupt signal,所以將程式中斷。

發送 signal 可以用 sigaction() 或 signal(),不過建議使用 sigaction 因為比較新,詳細差別可以看 Stack Overflow 這篇 「What is the difference between sigaction and signal?」。

如果想觸發 signal,可以用 kill() 或 sigqueue(),差別在於後者僅限 Linux,但後者可以藉由傳送 siginfo 加一些資訊在 signal 中。此外一些 system call 本身也會觸發 signal,例如如果嘗試 send() 到不存在的 socket,就會觸發 SIGPIPE。

Continue reading

Use `mmap` to create shared objects

當我們有很多 processes 時,並想用實現 shared memory 處理共用資料時,就可以使用 shared memory,來實作。建立 shared memory 可以使用 mmap 或是 System V shmget,但根據 Stack Overflow 「How to use shared memory with Linux in C」回答,shmget 已經有點過時,mmap 則比較新和彈性。

Shared memory 讓我們可以建立一塊共用的記憶體空間,mmap 會回傳一塊記憶體空間的指標,型別是 void *,如果我們想要放資料進去,可以用 memcpy 將物件、字串或任何東西拷貝進去。我們也可以直接將 void * 轉型成物件指標,這樣就建立 shared object,不同 process 可以直接對 process 存取物件。

Continue reading
  • Page 1 of 1