go-signal - 解説
実装の詳細
ビット操作
// バイトからビットを取り出す
for i := 7; i >= 0; i-- {
bit := (b >> i) & 1
// bit は 0 または 1
}
// ビットからバイトを構築
var b byte
for i := 7; i >= 0; i-- {
if receivedBit == 1 {
b |= (1 << i)
}
}
シグナルハンドリング
Go では os/signal パッケージを使用します:
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGUSR1, syscall.SIGUSR2)
for sig := range sigChan {
switch sig {
case syscall.SIGUSR1:
// 0 を受信
case syscall.SIGUSR2:
// 1 を受信
}
}
タイミングの問題
シグナルは非同期なので、送信間隔を適切に設定する必要があります:
// 遅すぎる: 通信が遅い
time.Sleep(1 * time.Millisecond)
// 速すぎる: シグナルが消失する可能性
time.Sleep(1 * time.Microsecond)
// 適切な範囲
time.Sleep(100 * time.Microsecond)
よくある間違い
- ビット順序の逆転: MSB と LSB の順序を間違える
- シグナル消失: 送信が速すぎて受信側が処理できない
- 競合状態: 複数のシグナルが同時に到着