【发布时间】:2012-07-09 09:51:10
【问题描述】:
我写了拦截accept()函数的LD_PRELOAD。我有一个问题,因为有时接受函数给了我相同的文件描述符。我只为一个进程加载这个预加载
我的代码:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
int fd;
fd = (*realAccept)(sockfd, addr, addrlen);
if(fd >= 0)
{
printf("file descriptor: %d\n", fd);
...
return fd;
}
}
int close(int fd)
{
printf("close decriptor: %d\n", fd);
return (*realClose)(fd);
}
输出是:
文件描述符:213
文件描述符:213
...
关闭描述符:213
为什么accept函数返回相同的文件描述符?
谢谢!
【问题讨论】:
-
也许你可以在连接被接受后装配接受功能来打印一些其他信息,例如进程的 pid,以及该 pid 的
lsof -p %u的输出。system调用可能能够实现后者。 -
我只将此预加载加载到一个进程
-
你确定进程没有调用
fork()? -
不过,lsof 可能会产生关于这两个连接是否是不同的连接,以及第一个连接是否仍然在其他 fd 下打开的信息。
标签: c++ linux intercept ld-preload