如何在Linux系统中挂起文件保存(显示我的程序对话框,然后用它们进行操作)?
答案 0 :(得分:3)
只需使用inotify接口即可获取文件系统更改的通知。请参阅:http://linux.die.net/man/7/inotify
答案 1 :(得分:1)
您可以尝试使用钩子生成C ++代码的FILE_PRELOAD utility,编译和LD_PRELOAD。简单看一下就可以感觉到linux的挂钩有多容易。起点是this tutorial。
例如,如果你想用/ tmp / replace_with更改文件/ tmp / some的'open call':
#: FILE_PRELOAD -C "A+f:/tmp/some:/tmp/replace_with" -- bash
#: echo "HaHa" >> /tmp/some
#: ll /tmp/some
ls: cannot access /tmp/some: No such file or directory
#: cat /tmp/replace_with
HaHa
如果您想查看生成代码的来源,只需在选项中添加“-p”。
#: FILE_PRELOAD -p -C "A+f:/tmp/some:/tmp/replace_with" -- bash
您可以在/ tmp / $ USER / FILE_PRELOAD / cpp中找到所有generated.cpp文件。
与linux钩子玩得很好)
生成的代码如下所示:
#include <sys/types.h>
#include <dlfcn.h>
#include <stdio.h>
#include <map>
#include <string>
#define I int
#define C char
#define S string
#define P printf
#define R return
using std::map;
using std::string;
typedef map<S,S> MAP;
static I (*old_open)(const C *p, I flags, mode_t mode);
extern "C"
I open (const C *p, I flags, mode_t mode){
old_open = dlsym(RTLD_NEXT, "open");
P("open hook\n");
MAP files;
files[p]=p;
files["/tmp/some"]="/tmp/replace_with";
S newpath = files[S(p)];
R old_open(newpath.c_str(), flags, mode);
}
# &compile
gcc -w -fpermissive -fPIC -c -Wall file.cpp
gcc -shared file.o -ldl -lstdc++ -o wrap_loadfile.so
LD_PRELOAD=./wrap_loadfile.so bash
nm -D /lib/libc.so.6 | grep open # we hook this syscall
答案 2 :(得分:0)
如果您可以编译它们,您可以首先链接提供open()的自定义库。
有一种做法的方式。
如果你无法编译它,这大部分时间都有效:
执行系统调用(NR_OPEN,...)
的函数_open_posthook提供提供新打开的共享库libopenhook。 Rembember你在这里重命名为_open_posthook(),除非你想要递归。别忘了也提供creat()。
使用LD_PRELOAD加载此库。
编辑:如果您正在尝试安全性,这将无效。你可能能够使用strace(),但除非你非常小心,否则一个坚定的程序员也可以克服它。