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 の順序を間違える
  • シグナル消失: 送信が速すぎて受信側が処理できない
  • 競合状態: 複数のシグナルが同時に到着