标签: libc

确定准备好进行 recv() 处理的字节数

我可以用来select()确定对 的调用是否recv()会阻塞,但是一旦我确定有要读取的字节,是否有办法在实际调用之前查询当前有多少字节可用recv()

select libc blocking

1
推荐指数
1
解决办法
7110
查看次数

不同字符串指针/数组类型的strsep分段错误

平台:Linux,OSX
编译器:GCC

我有一个简单的程序,目前让我感到困惑 - 我知道我正在搞乱几种不同类型的数组/指针来产生这个问题 - 它是故意的 - 我试图理解它.

列出的代码将按预期编译和运行,但会data4在调用中strsep(&data4, "e");更改data1data3导致分段错误.我想了解原因.

#include <stdio.h>
#include <string.h>

int main(int c, char** v) {
    char* data1 = "hello\0";
    char* data2 = strdup(data1);
    size_t sz = strlen(data1);
    char data3[sz+1];
    char* data4;

    memset(data3, 0, sz+1);
    data4 = strncpy(data3, data1, sz);
    data4[sz] = '\0';

    char* found = strsep(&data4, "e");

    if (found == NULL) {
        printf("nothing found\n");
    } else {
        printf("found e\n");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c string memory-management libc

1
推荐指数
1
解决办法
2005
查看次数

IsBadReadPtr类似于Unix

在Unix中是否有类似于IsBadReadPtr的函数?至少IsBadReadPtr的一些功能?我想编写一个程序,如果某个进程发生了不好的事情(如SIGSEGV),它会做出反应并恢复一些信息.但我想检查指针,以确保数据没有损坏,看看它们是否可以安全访问.否则崩溃处理程序本身将崩溃,从而变得无用.

有什么建议?

c unix debugging libc

1
推荐指数
1
解决办法
2776
查看次数

使用regcomp进行^ [az] {0,20000} $正则表达式编译的可怕性能

我想知道为什么这样一个正则表达式的编译占用了我的RAM的70%,导致强烈的交换和16的负载平均值:

strcpy(regexStr,"^[a-z]{0,20000}$" );
regcomp( &regex , regexStr , REG_NOSUB | REG_EXTENDED );
Run Code Online (Sandbox Code Playgroud)

执行时间大约为几分钟(之前必须终止进程).^[a-z]{0,2000}$(2,000,而不是20,000)的执行大约是100ms,这对我来说很重要.

我用它来检查一个模式,同时检查长度.我发现正则表达式对两者都很方便.难道我做错了什么 ?

regex memory performance libc

1
推荐指数
1
解决办法
326
查看次数

printf("%d",1.0)是否未定义?

根据C89草案第4.9.6.1节,%d是一个字符,用于指定要应用的转换类型.

在我看来,转换一词意味着printf("%d", 1.0)定义了.

请确认或反驳此事.

c printf glibc stdio libc

1
推荐指数
2
解决办法
311
查看次数

从已删除的文件中读取

我在C中写了一个小程序,我成功打开了一个文件,然后叫睡眠20秒.在那20秒我用shell中的rm删除了打开的文件.睡眠后,程序成功读取数据并将其打印在屏幕上.

int bytes_read;
FILE *fp = fopen("/tmp/file", "r");
sleep(20);
bytes_read = fread(buf, 1, 5, fp);
buf[bytes_read] = '\0';
printf("%s", buf);
Run Code Online (Sandbox Code Playgroud)

我希望它读取0个字节,但它会在文件中打印实际数据.这种行为背后的解释是什么?

c linux filesystems file libc

1
推荐指数
1
解决办法
126
查看次数

成功执行3行后的分段错误

这个程序工作,
它逐行读取一个大的日志文件,读完3行后,显示分段错误.

int main(int argc, char *argv[])
{
  char *line;
  FILE *my_stream;
  char *my_filename = "log";
  my_stream = fopen (my_filename, "r");
  while(fscanf (my_stream, "%s", &line)!= EOF)
  {
  printf ("==> %s\n", &line);
  }
  fclose (my_stream);   
  return 0;
 } 
Run Code Online (Sandbox Code Playgroud)

OUTPUT

==> 123    ==> 12345    ==> 1234568 Segmentation fault
Run Code Online (Sandbox Code Playgroud)

c gcc libc

1
推荐指数
1
解决办法
158
查看次数

重写编译对象的共享库 undef 符号版本

我正在尝试编译和链接一个程序(我们称之为 myprog),该程序与共享库(在本例中为libcryto 和 libssl,但实际库不相关)链接。我正在Centos 5.5上构建它,但希望在其他类似RHEL的发行版(例如 CloudLinux)上运行相同的二进制文件。两者都具有相同库的版本SO_NAME(即DT_NEEDED版本对应)。

我的问题是这个。当我在 Centos 上编译时,我看到:

centos$ objdump -T myprog | fgrep SSL_new
0000000000000000      DF *UND*  0000000000000000  libssl.so.10 SSL_new
Run Code Online (Sandbox Code Playgroud)

这工作正常,因为:

centos$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000000000447d0 g    DF .text  0000000000000390  libssl.so.10 SSL_new
Run Code Online (Sandbox Code Playgroud)

但是,在 CloudLinux 上:

cloudlinux$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000033a623a120 g    DF .text  0000000000000390  Base        SSL_new
Run Code Online (Sandbox Code Playgroud)

请注意 SSL 符号的版本已从 更改libssl.so.10Base

这意味着当我运行二进制文件时,我得到:

cloudlinux$ ./myprog
./myprog: /usr/lib64/libcrypto.so.10: no version information …
Run Code Online (Sandbox Code Playgroud)

linux linker libc binutils objcopy

1
推荐指数
1
解决办法
2685
查看次数

POSIX标准是否指定应遵循哪些调用约定函数(如read())?

我知道POSIX定义了应在兼容系统中提供的一组功能。这些措施包括read()write()printf(),和其他许多我们所知道的“的libc”功能。

但是POSIX是否为它们强制执行调用约定,还是由OS实现者选择?

c posix libc

1
推荐指数
1
解决办法
85
查看次数

重新定义gcc-arm-none-eabi的stdlibc的某些功能

STM32芯片(以及许多其他芯片)具有硬件随机数发生器(RNG),它比libc提供的软件RNG更快,更可靠。编译器对硬件一无所知。

有没有办法重新定义的实现rand()

还有其他硬件模块,即实时时钟(RTC),可以为提供数据time()

embedded gcc arm libc stm32

1
推荐指数
1
解决办法
79
查看次数