gpt4 book ai didi

linux - 减少程序的 sleep() 函数

转载 作者:太空狗 更新时间:2023-10-29 11:34:02 27 4
gpt4 key购买 nike

我有一个为 Linux 开发的二进制程序,它从服务器的网络流中读取行。它的通信以一种我需要很长时间才能弄清楚的方式加密,所以我无法重写它。

输出每一行后,程序调用nanosleep(100000000)(我使用strace发现了这个)但是,当服务器快速连续发送多行时,有一个实际流和输出之间有很大的延迟。

由于我没有程序的源代码,我的问题是:有没有办法减少这个软件的休眠时间? “加速”了吗?

作为引用,该程序是 Punkbuster 的 PBUcon

最佳答案

您可以尝试 LD_PRELOAD 技巧:

/* nosleep.c */
#include <time.h>
#include <unistd.h>

int sleep(unsigned int seconds)
{
return 0;
}
int usleep(useconds_t usec)
{
return 0;
}
int nanosleep(const struct timespec *req, struct timespec *rem)
{
return 0;
}

然后编译:

$ gcc -o libnosleep.so -shared nosleep.c -fpic

然后运行你的程序:

$ LD_PRELOAD=./libnosleep.so pbucon

有几点你应该注意:

  1. 它将替换对nanosleep每次 调用,不仅是您不喜欢的调用,而且可能会产生微妙的不良影响。如果您觉得需要,可以检查参数的特定值。
  2. 它不适用于 suid/sgid 程序。
  3. 它只适用于动态链接程序,不适用于静态链接程序。

更新:如果您想将调用链接到原始函数,您可以执行以下操作:

#define _GNU_SOURCE 

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>

int usleep(useconds_t sec)
{
typedef int (*usleep_f)(useconds_t);
static usleep_f real_usleep = NULL;
if (!real_usleep)
real_usleep = (usleep_f)dlsym(RTLD_NEXT, "usleep");

printf("%d\n", (int)sec);

if (...)
return real_usleep(sec);
else
return 0;
}

如果您想避免使用 GNU 扩展(RTLD_NEXT 就是其中之一),您必须找到包含该函数的共享库的名称,例如:

$ objdump -p pbucon.run | grep NEEDED
NEEDED libc.so.6

然后,在函数中做:

    if (!real_usleep)
{
void *libc_so = dopen("libc.so.6", RTLD_GLOBAL);
real_usleep = (usleep_f)dlsym(libc_so, "usleep");
}

关于linux - 减少程序的 sleep() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9302614/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com