SunOS プラットフォームが提供する STREAMS インタフェースには、開いたファイル記述子をあるプロセスから別のプロセスに渡すメカニズムが用意されています。開いたファイル記述子を渡したいプロセスは、 コマンド引数 I_SENDFD を指定して ioctl(2) を使用します。ファイル記述子を取得したいプロセスは、コマンド引数 I_RECVFD を指定して ioctl(2) を使用します。
次の例では、親プロセスはまず、テストファイルについての情報を出力し、パイプを作成します。親プロセスは次に、テストファイルを開いて、開いたファイル記述子をパイプ経由で親プロセスに返すような子プロセスを作成します。そのあと、親プロセスは新しいファイル記述子の状態情報を表示します。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stropts.h>
#include <stdio.h>
#define TESTFILE "/dev/null"
main(int argc, char *argv[])
{
int fd;
int pipefd[2];
struct stat statbuf;
stat(TESTFILE, &statbuf);
statout(TESTFILE, &statbuf);
pipe(pipefd);
if (fork() == 0) {
close(pipefd[0]);
sendfd(pipefd[1]);
} else {
close(pipefd[1])
recvfd(pipefd[0]);
}
}
sendfd(int p)
{
int tfd;
tfd = open(TESTFILE, O_RDWR);
ioctl(p, I_SENDFD, tfd);
}
recvfd(int p)
{
struct strrecvfd rfdbuf;
struct stat statbuf;
char fdbuf[32];
ioctl(p, I_RECVFD, &rfdbuf);
fstat(rfdbuf.fd, &statbuf);
sprintf(fdbuf, "recvfd=%d", rfdbuf.fd);
statout(fdbuf, &statbuf);
}
statout(char *f, struct stat *s)
{
printf("stat: from=%s mode=0%o, ino=%ld, dev=%lx, rdev=%lx\n",
f, s->st_mode, s->st_ino, s->st_dev, s->st_rdev);
fflush(stdout);
}