linuxではファイルディスクリプタを使い、例えばソケットやファイルの操作などを行います。その際、あるディスクリプタを他のプロセスに送りたいことがあるかもしれません。ここではその方法を解説します。
ディスクリプタを別プロセスに送信するためには、送受信用のソケットを作成する必要があります。この場合は特に、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; }