【问题标题】:Same SOCKET id when accept on linux?在Linux上接受时相同的SOCKET id?
【发布时间】: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


【解决方案1】:

我敢打赌这是由于stdout 的缓冲造成的错误。也许有一些其他线程在使用它......再加上您没有包含结尾 \n 的事实可能会导致输出中出现重复的行。

如果您想确定,请在字符串末尾添加\n,并在每次调用printf() 后添加fflush(stdout)

【讨论】:

  • 您可以尝试打印一个全局变量并每次递增它,以确保您被调用两次吗?:printf("file descriptor: %d %d\n", fd, global++);
猜你喜欢
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多