这可能是不可能的,但是......我有一个第三方应用程序(出于好奇而咕哝),可以被告知打开一个文件进行写入(我提供名称),并将字节转储到其中,直到被告知停止。它不会打开文件进行追加,如果文件已存在,它会更改名称并重试。一切都很好,很好而且相当标准。它可以写入几个小时(并且很乐意填满磁盘,这就是问题所在)。
我想拦截它写入的所有内容并从另一个进程读取它;理想情况下它根本不会进入磁盘,但我会接受其中一些妥协。
显而易见的解决方案是在写入文件时读取文件,truncate()我读取并再次读取的内容对我来说不起作用,因为当我截断时文件不会变小 - mumble 没有指定附加,所以它会从上次停下的地方继续写下去。理想情况下,我需要某种方法来欺骗它,让它认为它创建并正在写入一个普通文件,而实际上它只是将所有内容通过管道传输给我。我不想为此编写自己的文件系统代码(除非这比看起来容易得多)。
最终我想获取录制的声音,将其散列并将其提供给 /dev/random。仅仅将 mumble 指向 /dev/random 是行不通的,因为 /dev/random 存在,所以它不会使用它。
有什么巧妙的技巧吗?如果没有,有什么方法可以编写看起来像目录的用户态代码吗?如果一切都失败了,那么编写一个可以满足我需要的文件系统是否相当简单?
答案1
您可以使用LD_预加载使 mumble 在所有其他库之前加载您指定的库。您可以使用自定义open()
/ stat()
/etc 编写一个小型库,根据文件名,该库要么将调用传递给标准 C 库以实现标准行为,要么执行一些特殊操作来欺骗 mumble。