pipe:splice/teeサンプル
Rev.1を表示中。最新版はこちら。
[root@localhost north]# cat pipe.c
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/syscall.h>
void read_pipe_print(int pfd, char* pfdtype);
void write_pipe1();
void pipe_splice(int cnt);
void pipe_tee(int cnt);
void pipe_read_write(int cnt);
int pfd1[2], pfd2[2];
char *pdata = "1234567890";
void main(int argc, char *argv[])
{
pipe2(pfd1, O_NONBLOCK);
pipe2(pfd2, O_NONBLOCK);
int cnt = atoi(argv[2]);
write_pipe1();
if(!strcmp(argv[1], "READ_WRITE")) {
pipe_read_write(cnt);
}
if(!strcmp(argv[1], "SPLICE")) {
pipe_splice(cnt);
}
if(!strcmp(argv[1], "TEE")) {
pipe_tee(cnt);
}
read_pipe_print(pfd1[0], "pfd1");
read_pipe_print(pfd2[0], "pfd2");
printf("\n");
}
void pipe_read_write(int cnt)
{
char buff[64];
cnt = read(pfd1[0], buff, cnt);
write(pfd2[1], buff, cnt);
}
void pipe_splice(int cnt)
{
splice(pfd1[0], NULL, pfd2[1], NULL, cnt, 0);
}
void pipe_tee(int cnt)
{
syscall(SYS_tee, pfd1[0], pfd2[1], cnt, 0);
}
void write_pipe1()
{
write(pfd1[1], pdata, strlen(pdata));
}
void read_pipe_print(int pfd, char* pname)
{
char buff[64];
int cnt = read(pfd, buff, 64);
buff[cnt] = 0;
printf("%s -> %s\n", pname, buff);
}
[root@localhost north]# ./pipe.out READ_WRITE 1
pfd1 -> 234567890 pfd2 -> 1[root@localhost north]# ./pipe.out READ_WRITE 2
pfd1 -> 34567890 pfd2 -> 12
[root@localhost north]# ./pipe.out SPLICE 1
pfd1 -> 234567890 pfd2 -> 1[root@localhost north]# ./pipe.out SPLICE 2
pfd1 -> 34567890 pfd2 -> 12
[root@localhost north]# ./pipe.out TEE 1
pfd1 -> 1234567890 pfd2 -> 1[root@localhost north]# ./pipe.out TEE 2
pfd1 -> 1234567890 pfd2 -> 12
north@localhost ]
[root@localhost mnt1]# cat babakaka.c
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/syscall.h>
void read_pipe(int pfd, char* pfdtype);
void write_pipe1();
void pipe_splice();
void pipe_tee();
void pipe_file();
int pfd1[2], pfd2[2];
char *pdata = "1234567890abcdefg";
void main(int argc, char *argv[])
{
pipe2(pfd1, O_NONBLOCK);
pipe2(pfd2, O_NONBLOCK);
write_pipe1();
if(!strcmp(argv[1], "READ")) {
pipe_read();
}
if(!strcmp(argv[1], "SPLICE")) {
pipe_splice();
}
if(!strcmp(argv[1], "TEE")) {
pipe_tee();
}
read_pipe(pfd1[0], "pfd1");
read_pipe(pfd2[0], "pfd2");
}
void pipe_read()
{
char buff[64];
int cnt = read(pfd1[0], buff, strlen(pdata));
write(pfd2[1], buff, cnt);
}
void pipe_splice()
{
splice(pfd1[0], NULL, pfd2[1], NULL, strlen(pdata), 0);
}
void pipe_tee()
{
syscall(SYS_tee, pfd1[0], pfd2[1], strlen(pdata), 0);
}
void write_pipe1()
{
if (write(pfd1[1], pdata, strlen(pdata)) < 0) {
printf("write pipe err\n");
}
}
void read_pipe(int pfd, char* pname)
{
char buff[64];
int cnt;
printf("%s -> ", pname);
cnt = read(pfd, buff, 64);
if (cnt >= 0) {
buff[cnt] = 0;
printf("%s\n", buff);
}
else {
printf("no data in pipe buffer\n");
}
}
[root@localhost mnt1]# ./babakaka.out READ
pfd1 -> no data in pipe buffer
pfd2 -> 1234567890abcdefg
[root@localhost mnt1]# ./babakaka.out SPLICE
pfd1 -> no data in pipe buffer
pfd2 -> 1234567890abcdefg
[root@localhost mnt1]# ./babakaka.out TEE
pfd1 -> 1234567890abcdefg
pfd2 -> 1234567890abcdefg





