[OI] 交互 | pipe
关于如何在本地实现交互
管道
Linux 内置了一种管道操作,可以方便地把 \(A\) 程序的输出和 \(B\) 程序的输入连接起来,只需要以下指令:
A | B
此代码行的意思是:同时运行 \(A\) 和 \(B\),以及把 \(A\) 程序的输出和 \(B\) 程序的输入连接起来
实测
现有两个程序 a.cpp
与 b.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
管道,而这个管道现在并没有东西,会阻塞程序运行 - 需要开两个线程来运行,因为你在一个终端里是不能同时跑两个指令的