Linuxでソケットペア機能を利用する場面
Linux の socketpair() 関数は、互いに接続するソケットのペアを作成するために使用されます。これは、同じプロセス内でのプロセス間通信 (IPC) に使用できます。
socketpair()関数のプロトタイプは以下の通りです。
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
パラメータの説明:
- ソケットを作成する際に使用するプロトコルファミリを指定します。通常は AF_UNIX と AF_INET が使用されます。
- ソケットの種類を指定します。通常は SOCK_STREAM または SOCK_DGRAM を設定します。
- proto:プロトコル – ソケットが使用するプロトコルを指定し、通常は 0 です。
- ソケット記述子が作成されると返される2つの要素の整数型の配列。
socketpair()関数は一組の接続されたソケットを作成し、2つのソケットは同じプロセス内でインデックス0と1で相互通信できます。ここで、インデックス0のソケットはデータの読み取りに使用され、インデックス1のソケットはデータの書き込みに使用されます。
プロセス間通信を行うsocketpair()関数の使用例は次のとおりです。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int main() {
int sv[2];
char buf[1024];
pid_t pid;
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) < 0) {
perror("socketpair");
return 1;
}
pid = fork();
if (pid < 0) {
perror("fork");
return 1;
} else if (pid == 0) {
// 子进程
close(sv[0]); // 子进程关闭读取端
write(sv[1], "Hello from child", sizeof("Hello from child"));
close(sv[1]);
} else {
// 父进程
close(sv[1]); // 父进程关闭写入端
read(sv[0], buf, sizeof(buf));
printf("Received: %s\n", buf);
close(sv[0]);
}
return 0;
}
上記の例では、まずsocketpair()関数で相互につながったソケットペアを作成し、そのあとfork()関数で子プロセスを作成します。子プロセスはwrite()関数で親プロセスにメッセージを渡し、親プロセスはread()関数で子プロセスから渡されたメッセージを受け取り、印字を出力します。
ソケットペア関数はプロセス内インタープロセス通信に利用できるもので、プロセス間でデータをやり取りするためのシンプルな手段を提供しています。