Code makes the world a better place

Unix における `sigaction` を使ったシグナルの例

Unix ではプロセス間通信の方法がいくつもあります。本記事では signal(シグナル)の簡単な使い方を紹介します。まずは Beej の紹介 を読むと良いです。名前のとおり、signal はプロセスが送受信する通知です。例えばシェルを使っているときに Ctrl-C でプログラムを中断できるのは、シェルが 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 を発生させることもあります。例えば存在しない socket に対して send() しようとすると SIGPIPE が発生します。

Continue reading

`mmap` を使って共有オブジェクトを作る

多数のプロセスがあり、共有データを扱うために 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(共有オブジェクト)を作れます。こうすると別々のプロセスが同じオブジェクトへ直接アクセスできます。

Continue reading
  • Page 1 of 1