2010-07-26

linuxプロセスファイルディスクリプタを送る方法

linuxではファイルディスクリプタを使い、例えばソケットやファイルの操作などを行います。その際、あるディスクリプタを他のプロセスに送りたいことがあるかもしれません。ここではその方法を解説します。

方法

  1. ディスクリプタ送受信用のソケットを、それぞれのプロセス作成
  2. ソケットの補助データ(後述)を送るための、msghdr構造体を用意
  3. 実際に送信し、別プロセス側で受信する
1, ディスクリプタ送受信用のソケットを、それぞれのプロセス作成

ディスクリプタを別プロセスに送信するためには、送受信用のソケットを作成する必要があります。この場合は特に、unix domainのUDPソケットを作成する必要があります。

unix socketとはネットワークを介さずに使えるソケットインターフェースです。接続アドレスファイル名で指定されます。このためソケットを作った後はそのファイル作成されます。ただし、送受信データはそのファイルではなくカーネル内のメモリに保存されます。

ソケットはsocketシステムコールにより作成します。その際、第一引数にAF_LOCALを、第二引数にSOCK_DGRAMを指定することで所望のソケットを得ることができます。なお、受信側ソケットの場合は、bindにより受信アドレスを設定する必要があります。

#define UNIX_SOCKET_PATH "/tmp/socket2010"

int make_socket(int is_receiver)
{
    // create the unix domain udp socket.
    int sock = socket(AF_LOCAL, SOCK_DGRAM, 0);

    if (is_receiver) {
        struct sockaddr_un addr; // include sys/un.h

        unlink(UNIX_SOCKET_PATH);

        memset(&addr, 0, sizeof(addr));
        addr.sun_family = AF_LOCAL;
        strcpy(addr.sun_path, UNIX_SOCKET_PATH);
        bind(sock, (struct sockaddr *)&addr, sizeof(addr));
    }

    return sock;
}

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん