2015-06-10 19 views
3

您好我有一个运行两个程序一个文件输入到两个程序脚本

#Script file 
./prog1 
./prog2 

PROG1是一个C程序

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv){ 
    printf("prog1 running\n"); 
    int tmp; 
    scanf("%d", &tmp); 
    printf("%d\n", tmp+10); 
    printf("prog1 ended\n"); 
    return 0; 
} 

PROG 2是一个C程序以及

脚本
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv){ 
    printf("prog2 running\n"); 
    int tmp; 
    scanf("%d\n", &tmp); 
    printf("%d\n", tmp+10); 
    printf("prog2 ended\n"); 
    return 0; 
} 

我运行命令

./s CRIPT <文件

其中file是

123 
456 

输出是

prog1 running 
133 
prog1 ended 
prog2 running 
10 
prog2 ended 

好像PROG2没有从文件的输入,什么是引擎盖下发生?

prog2是否可能用“\ n”代替数字?

+1

两个进程之间共享一个输入文件描述符(它们从脚本继承它)。第一个进程吞噬了所有的数据。第二个进程然后在文件的最后找到fd。如果这需要工作,你可以在一个(或两个)进程中倒回fd。 –

+0

所以你的意思是当我运行脚本时,会为'script'创建一个新的文件入口,然后脚本fork'prog1'' prog2',所以'prog1'' prog2'从'script'继承文件描述符。由于'prog1'吃掉了所有的输入,这个文件的文件入口的偏移量指向文件的末尾,所以'prog2'什么也得不到。 –

+1

是的,就是这样。这个小shell脚本说明了这个概念:'{echo'Line 1';读-r line1;回声“$ line1”;回声“2号线”;读-r line2;回声“$ line2”; } <<< $'content line 1 \ ncontent line 2'' –

回答

0

你的脚本应该是这样的:

#!/bin/bash 
exec 3<&1 
tee >(./prog2 >&3) | ./prog1 

此使用tee命令复制标准输入和最近>()的bash功能打开临时文件描述符。 (使用filedesriptor 3来完成stdout的无并行处理)。

查看this answer阅读全文。

0

scanf reads 缓冲输入。因此,当您的第一个程序从stdin中读取时,它推测性地提前读取所有可用输入,以使得从stdin以后的读取更快(通过避免必须进行如此多的系统调用)。当第二个程序运行时,没有任何输入,并且(因为您未能检查scanf()的结果),因此tmp中的结果为0。

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

相关问题