[OI] 交互 | pipe

关于如何在本地实现交互

管道

Linux 内置了一种管道操作,可以方便地把 \(A\) 程序的输出和 \(B\) 程序的输入连接起来,只需要以下指令:

A | B

此代码行的意思是:同时运行 \(A\)\(B\),以及把 \(A\) 程序的输出和 \(B\) 程序的输入连接起来

实测

现有两个程序 a.cppb.cpp 如下:

a.cpp

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a;
    while(cin>>a){
        cout<<a;
    }
}

b.cpp

include<bits/stdc++.h>
using namespace std;
int main(){
    int b=0;
    for(int i=1;i<=10;++i){
        cout<<b++;
    }
}

在终端执行的指令如下:

@stu:~$ vim b.cpp
@stu:~$ vim a.cpp
@stu:~$ g++ b.cpp -o b
@stu:~$ g++ a.cpp -o a
@stu:~$ ./b | ./a

特别声明:我真的不用 vim,但是 vim 用来干这种事情挺方便的

可以发现输出为 123456789,说明连接是成功的

文件管道

文件管道用于应对双侧交互的情况

具体地,使用如下命令可以创建一个新的文件管道

mkfifo name

创建好一个文件管道后,可以通过如下方式使用:

./a > name

表示输出到管道 name 中

但是管道是无法被用户读取的,只能通过运行另一个程序来读入内容:

./b < name

表示将管道 name 中的内容输入到 b 中

这样,我们就实现了和刚才 ./b | ./a 一样的功能

实际上文件管道主要是用来处理双侧交互的:

mkfifo input output
./a >input <output
./b >input <output

需要注意的有两点:

  • 这里运行是有顺序的,一定要把 > input 写在前面,不然会先打开 output 管道,而这个管道现在并没有东西,会阻塞程序运行
  • 需要开两个线程来运行,因为你在一个终端里是不能同时跑两个指令的
posted @ 2024-08-19 19:52  HaneDaniko  阅读(26)  评论(0编辑  收藏  举报