pipe_fifo

https://www.cnblogs.com/meihao1203/p/8443827.html


 

2019年2月27日11:51周三农历 己亥 猪年 正月廿三

[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# mkfifo 1.pipe 2.pipe
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# cat a.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
int main(int argc, char** argv)
{
    int fdw = open(argv[1],O_WRONLY);
    printf("fdw=%d\n",fdw);
    write(fdw,"hello",5);
    return 0;
}
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# cat b.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
int main(int argc, char** argv)
{
    int fdr = open(argv[1],O_RDONLY);
    printf("fdr=%d\n",fdr);
    char buf[10]="";
    read(fdr,buf,sizeof(buf));
    printf("buf=%s\n",buf);
    return 0;
}
    [root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]#gcc a.c -o a  
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]#gcc b.c -o b 
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# cat makefile   
target:a.c b.c
        gcc a.c -o a   #前面换行必须用tab键,否则报错:makefile:2: *** 遗漏分隔符 。 停止。
        gcc b.c -o b 
#.PHONY:clean
clean:
        rm -f a b
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# make clean
rm -f a b
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# ll
总用量 12
prw-r--r-- 1 root root   0 2月  27 11:20 1.pipe
prw-r--r-- 1 root root   0 2月  27 11:20 2.pipe
-rw-r--r-- 1 root root 221 2月  27 11:34 a.c
-rw-r--r-- 1 root root 276 2月  27 11:36 b.c
-rw-r--r-- 1 root root  70 2月  27 11:49 makefile
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# make
gcc a.c -o a
gcc b.c -o b
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# ll
总用量 36
prw-r--r-- 1 root root    0 2月  27 11:20 1.pipe
prw-r--r-- 1 root root    0 2月  27 11:20 2.pipe
-rwxr-xr-x 1 root root 8610 2月  27 11:50 a
-rw-r--r-- 1 root root  221 2月  27 11:34 a.c
-rwxr-xr-x 1 root root 8609 2月  27 11:50 b
-rw-r--r-- 1 root root  276 2月  27 11:36 b.c
-rw-r--r-- 1 root root   70 2月  27 11:49 makefile
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]#
//如果打开读端,但是没有打开对应的写端,进程会卡住,等待写端打开
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# ./a 1.pipe &
[1] 31969
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# ./b 1.pipe &
[2] 31973
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# 
fdr=3
fdw=3
buf=hello
[1]-  完成                  ./a 1.pipe
[2]+  完成                  ./b 1.pipe
/*************两个进程***********/
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# 
fdw=3
fdr=3
buf=hello
[1]-  完成                  ./b 1.pipe
[2]+  完成                  ./a 1.pipe
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]#
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# cat a.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char* argv[]){
        if(argc !=3){
                printf("error args\n");
                return -1;
        }
        int fdw=open(argv[1],O_WRONLY);
        if(-1==fdw){
                perror("open");
                return -1;
        }
        int fdr=open(argv[2],O_RDONLY);
        if(-1==fdr){
                perror("open1");
                return -1;
        }
   //   printf("fdr=%d,fdw=%d\n",fdr,fdw);
        char buf[128];
        while(1){
                bzero(buf,sizeof(buf));
                read(0,buf,sizeof(buf));  //读取标准输入
                write(fdw,buf,strlen(buf)-1); //写入管道,回车不要

                memset(buf,0,sizeof(buf));
                read(fdr,buf,sizeof(buf));  //读取管道
                printf("%s\n",buf);        //把读到的内容写到屏幕
        }
        return 0;
}
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# cat b.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char* argv[]){
        if(argc !=3){
                printf("error args\n");
                return -1;
        }
        int fdr=open(argv[1],O_RDONLY);
        if(-1==fdr){
                perror("open");
                return -1;
        }
        int fdw=open(argv[2],O_WRONLY);
        if(-1==fdw){
                perror("open1");
                return -1;
        }
  //    printf("fdr=%d,fdw=%d\n",fdr,fdw);
        char buf[128];
        while(1){
                bzero(buf,sizeof(buf));
                read(fdr,buf,sizeof(buf));//读取管道
                printf("%s\n",buf);

                bzero(buf,sizeof(buf));
                read(0,buf,sizeof(buf));//读取标准输入
                write(fdw,buf,strlen(buf)-1);//写入管道
        }
        return 0;
}
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]#
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# ./a 1.pipe 2.pipe
^C
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# ./b 1.pipe 2.pipe
b_fdr=3,b_fdw=4
adsd
b_buf=adas
b_buf=asdasfa
adsfsdgsdgf
asdaf
sdagfdshgds
b_buf=asfvgvfsdagv
^C
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# cat b.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char* argv[]){
        if(argc !=3){
                printf("error args\n");
                return -1;
        }
        int fdr=open(argv[1],O_RDONLY);
        if(-1==fdr){
                perror("open");
                return -1;
        }
        int fdw=open(argv[2],O_WRONLY);
        if(-1==fdw){
                perror("open1");
                return -1;
        }
        printf("b_fdr=%d,b_fdw=%d\n",fdr,fdw);
        char buf[128];
        while(1){
                bzero(buf,sizeof(buf));
                read(fdr,buf,sizeof(buf));//读取管道
                //memmove(buf,"hello a",10);
                printf("b_buf=%s\n",buf);

                bzero(buf,sizeof(buf));
                read(0,buf,sizeof(buf));//读取标准输入
                write(fdw,buf,strlen(buf)-1);//写入管道
        }
        return 0;
}
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]# cat a.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char* argv[]){
        if(argc !=3){
                printf("error args\n");
                return -1;
        }
        int fdw=open(argv[1],O_WRONLY);
        if(-1==fdw){
                perror("open");
                return -1;
        }
        int fdr=open(argv[2],O_RDONLY);
        if(-1==fdr){
                perror("open1");
                return -1;
        }
        printf("a_fdr=%d,a_fdw=%d\n",fdr,fdw);
        char buf[128];
        while(1){
                bzero(buf,sizeof(buf));
                read(0,buf,sizeof(buf));  //读取标准输入
               //memmove(buf,"hello b",10);
                write(fdw,buf,strlen(buf)-1); //写入管道,回车不要

                memset(buf,0,sizeof(buf));
                read(fdr,buf,sizeof(buf));  //读取管道
                printf("_buf=%s\n",buf);        //把读到的内容写到屏幕
        }
        return 0;
}
[root@10.67.9.137 /newhome/wuyaoyao/Linux_Bash]#
 

在 Windows 平台上,可以使用命名管道(Named Pipe)来替代 UNIX/Linux 上的 FIFO(Named Pipe 也可以在 UNIX/Linux 上使用)。Named Pipe 是一种有名的、双向的、命名的、匿名管道。与 FIFO 类似,Named Pipe 也可以用于进程间通信,但与 FIFO 不同的是,Named Pipe 可以在不同的进程之间进行双向通信。 以下是在 Windows 平台上使用 Named Pipe 创建一个读管道的示例代码: ```c++ #include <windows.h> #include <stdio.h> #define BUFFER_SIZE 1024 #define PIPE_NAME "\\\\.\\pipe\\testpipe" int main() { HANDLE hPipe; char buffer[BUFFER_SIZE]; DWORD dwRead; hPipe = CreateNamedPipeA( PIPE_NAME, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, 0, NULL ); if (hPipe == INVALID_HANDLE_VALUE) { printf("CreateNamedPipe failed with error %d\n", GetLastError()); return 1; } while (1) { if (!ConnectNamedPipe(hPipe, NULL)) { printf("ConnectNamedPipe failed with error %d\n", GetLastError()); CloseHandle(hPipe); return 1; } if (ReadFile(hPipe, buffer, BUFFER_SIZE, &dwRead, NULL)) { printf("Read %d bytes: %s\n", dwRead, buffer); } else { printf("ReadFile failed with error %d\n", GetLastError()); } DisconnectNamedPipe(hPipe); } CloseHandle(hPipe); return 0; } ``` 该程序使用 CreateNamedPipeA 函数创建一个命名管道,并在管道上等待客户端连接。当客户端连接成功后,程序使用 ReadFile 函数从管道中读取数据,并输出到控制台。最后,程序使用 DisconnectNamedPipe 函数断开与客户端的连接。 你可以通过编写客户端程序来向该程序发送数据。方法与在 UNIX/Linux 上使用 FIFO 的方式相似,只需要使用 CreateFile、WriteFile、CloseHandle 等函数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值