嗨,我有一个运行两个程序的脚本
#Script file
./prog1
./prog2
prog1 是一个 C 程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
printf("prog1 runningn");
int tmp;
scanf("%d", &tmp);
printf("%dn", tmp+10);
printf("prog1 endedn");
return 0;
}
prog 2 也是一个 C 程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
printf("prog2 runningn");
int tmp;
scanf("%dn", &tmp);
printf("%dn", tmp+10);
printf("prog2 endedn");
return 0;
}
我运行命令
./script <文件>文件>
其中文件是
123
456
输出为
prog1 running
133
prog1 ended
prog2 running
10
prog2 ended
似乎 prog2 没有从文件中获取输入,引擎盖下发生了什么?
prog2 是否有可能采用""而不是数字?
你的脚本应该是这样的:
#!/bin/bash
exec 3<&1
tee >(./prog2 >&3) | ./prog1
这使用 tee
命令复制 stdin,并使用最近的 >()
bash 功能打开临时文件描述符。(使用 FileDesriptor 3 是为了在没有并行性的情况下拆分标准输出)。
请参阅此答案以阅读整个故事。
scanf
读取缓冲输入。 因此,当您的第一个程序从stdin
读取时,它会推测性地提前读取所有可用的输入,以使将来从stdin
读取的速度更快(通过避免进行如此多的系统调用)。 当第二个程序运行时,没有剩余的输入,并且(因为你未能检查scanf()
的结果)你最终在tmp
中
您应该能够使用 setvbuf()
标准函数修改应用程序中的缓冲策略(以牺牲速度为代价)。