动态生成文件内容(穷人的proc文件)

时间:2013-06-05 01:42:36

标签: c file stdout named-pipes file-descriptor

我正在尝试创建一个简单的用户空间程序,在读取文件时动态生成文件内容,就像虚拟文件系统一样。我知道有像FUSE这样的程序,但是对于我想做的事情,它们看起来有点沉重。

例如,一个简单的计数器实现看起来像:

 $ cat specialFile
 0
 $ cat specialFile
 1
 $ cat specialFile
 2

我当时认为specialFile可能是一个命名管道,但我运气不好。我也在想select可能会有所帮助,但我不确定如何使用它。我错过了一些基本概念吗?

#include <stdio.h>                                                                                                                                                                                      

int main(void)                                                                                                                                                                                          
{                                                                                                                                                                                                       
    char stdoutEmpty;                                                                                                                                                                                   
    char counter;                                                                                                                                                                                       

    while (1) {                                                                                                                                                                                         
        if (stdoutEmpty = feof(stdout)) { // stdout is never EOF (empty)?                                                                                                                               
            printf("%d\n", counter++);                                                                                                                                                                  
            fflush(stdout);                                                                                                                                                                             
        }                                                                                                                                                                                               
    }                                                                                                                                                                                                   
    return 0;                                                                                                                                                                                           
} 

然后用法就像:

shell 1 $ mkfifo testing
shell 1 $ ./main > testing
shell 2 $ cat testing
# should be 0?
shell 2 $ cat testing
# should be 1?

1 个答案:

答案 0 :(得分:0)

您需要使用FUSE。 FIFO不起作用,因为你的程序不断将内容推送到stdout(在这种情况下cat永远不会停止),或者它关闭stdout,在这种情况下你显然不能再写它了。