Node.js流和子进程 - 奇怪的行为

时间:2015-01-05 17:55:03

标签: javascript c node.js

我有一个c程序,它从stdin中读取整数值。我编写了一个nodejs程序来执行c文件,nodejs程序将读取一个文本文件(包含多行中的数字)并将此数据传递给子进程的stdin。

问题是,如果txt文件中的输入数小于预期数,则子进程将提供值0.我希望子进程等待直到收到数据。

c program

 #include<stdio.h>
 int main(){
     int a;
     printf("hekllowworls");

     scanf("%d",&a);
     printf("%d",a);

     scanf("%d",&a);
     printf("%d",a);    

     scanf("%d",&a);
     printf("%d",a);
 }

节点JS程序

var fs = require('fs'),
cp = require('child_process');

stream = fs.createReadStream('myfile.txt');
var obj = cp.spawn('/home/arju/Desktop/exec/a.out'); 

stream.pipe(obj.stdin);

obj.stdout.on('data',function(data){
    console.log(data.toString());
});

obj.on('error',function(err){
    console.log(err);
});

TextFile - Myfile.txt

10
20

1 个答案:

答案 0 :(得分:0)

根据man scanf

   The  value  EOF  is returned if the end of input is reached before either
   the first successful conversion or a matching  failure  occurs.   EOF  is
   also  returned  if a read error occurs, in which case the error indicator
   for the stream (see ferror(3)) is set, and  errno  is  set  indicate  the
   error.

我觉得你应该使用类似的东西:

r = scanf("%d",&a);
if (r != EOF) { ...

逻辑上,简单等待数据可能如下所示:

while(r = scanf("%d",&a)) {
    if (r == EOF) continue;
    printf("%d",a);
}

修改

据我所知,您应该使用无缓冲的IO操作,例如读/写系统控制。试试这个:

int main(){

    int n;
    char buf[255];

    while(1) {

        while((n = read(0,buf,sizeof(buf))) != 0){
            write(1,buf,n);
        }

    }
}

write() to stdout and printf output not interleaved?获取信息,好的答案,检查出来。

您的C程序从缓冲区读取值。在我的第一个例子中,它等待数据填充输出缓冲区,所以我没有输出。

编辑2:如何关闭缓冲区

只需对代码进行少量修改,您就可以在每次fflush(stdout)来电后使用printf

如果您无法编辑代码,请查看unix.stackexchange:https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe中的这个答案,有两个很好的解决方案。 (我更喜欢第二种,因为它来自coreutils)。