一个文件输入到脚本中的两个程序



嗨,我有一个运行两个程序的脚本

#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

得到0。

您应该能够使用 setvbuf() 标准函数修改应用程序中的缓冲策略(以牺牲速度为代价)。

相关内容

  • 没有找到相关文章

最新更新