過去の記事においてFIFOの性質を実験的に確かめた。
そこで、本記事において実際にFIFOを動かしてみたいと思う。
この記事を更新するか複数記事に分けて記録する自分用メモである。
なお、筆者の心が折れた場合は完結しない可能性がある。
まず作成。FIFOはファイルに見えるカーネルバッファへのハンドルだ。
形式上はファイルなので作成権限のあるディレクトリなら作成できる。
ターミナルから作成するにはmkfifoコマンドを使う。
user@user-virtual-machine:~/git/fifo$ ll
合計 8
drwxrwxr-x 2 user user 4096 9月 29 02:27 ./
drwxrwxr-x 6 user user 4096 9月 29 02:20 ../
user@user-virtual-machine:~/git/fifo$ mkfifo ./testfifo
user@user-virtual-machine:~/git/fifo$ ll
合計 8
drwxrwxr-x 2 user user 4096 9月 29 02:35 ./
drwxrwxr-x 6 user user 4096 9月 29 02:20 ../
prw-rw-r-- 1 user user 0 9月 29 02:35 testfifo|
user@user-virtual-machine:~/git/fifo$
pがパイプであることを示し、デフォルト属性は664のようだ。
形式上はファイルなので削除もできる。
user@user-virtual-machine:~/git/fifo$ ll
合計 8
drwxrwxr-x 2 user user 4096 9月 29 02:35 ./
drwxrwxr-x 6 user user 4096 9月 29 02:20 ../
prw-rw-r-- 1 user user 0 9月 29 02:35 testfifo|
user@user-virtual-machine:~/git/fifo$ rm ./testfifo
user@user-virtual-machine:~/git/fifo$ ll
合計 8
drwxrwxr-x 2 user user 4096 9月 29 02:38 ./
drwxrwxr-x 6 user user 4096 9月 29 02:20 ../
user@user-virtual-machine:~/git/fifo$
プログラムからも作成可能。
f1.cpp
#include <bits/stdc++.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
//ブロックされないようにNONBLOCK指定で開く
int fd = open("./testfifo", O_RDONLY | O_NONBLOCK);
if(fd > 0) {
printf("./testfifo is already exist.\n");
close(fd);
} else {
int ret = mkfifo("./testfifo",
S_IRUSR | // ユーザリード権限
S_IWUSR | // ユーザライト権限
S_IRGRP | // グループリード権限
S_IWGRP | // グループライト権限
S_IROTH // 他人にリード権限
);
if(ret == 0) {
printf("./testfifo is created successful.\n");
} else {
printf("./testfifo is create failed.\n");
}
}
return 0;
}
実行するとこうなる。
user@user-virtual-machine:~/git/fifo$ ll
合計 32
drwxrwxr-x 2 user user 4096 9月 29 02:59 ./
drwxrwxr-x 6 user user 4096 9月 29 02:20 ../
-rwxrwxr-x 1 user user 16920 9月 29 02:55 f1*
-rw-rw-r-- 1 user user 732 9月 29 02:55 f1.cpp
user@user-virtual-machine:~/git/fifo$ ./f1
./testfifo is created successful.
user@user-virtual-machine:~/git/fifo$ ll
合計 32
drwxrwxr-x 2 user user 4096 9月 29 02:59 ./
drwxrwxr-x 6 user user 4096 9月 29 02:20 ../
-rwxrwxr-x 1 user user 16920 9月 29 02:55 f1*
-rw-rw-r-- 1 user user 732 9月 29 02:55 f1.cpp
prw-rw-r-- 1 user user 0 9月 29 02:59 testfifo|
user@user-virtual-machine:~/git/fifo$ ./f1
./testfifo is already exist.
user@user-virtual-machine:~/git/fifo$
とりあえずはここまで。